Заполнение списка выбора из таблицы данных - PullRequest
3 голосов
/ 17 сентября 2009

Я выполнил запрос и вернул таблицу данных,

myDataAdapter.Fill(myDataTable);

Каков наилучший способ загрузки значений строк «Значение» и «Текст» в список выбора?

Спасибо

Ответы [ 8 ]

7 голосов
/ 15 июня 2012

Я не смог найти способ напрямую связать DataTable с SelectList, поэтому я решил создать метод Extension для этого:

public static SelectList ToSelectList(this DataTable table, string valueField, string textField)
{
    List<SelectListItem> list = new List<SelectListItem>();

    foreach (DataRow row in table.Rows)
    {
        list.Add(new SelectListItem() 
        {
            Text = row[textField].ToString(), 
            Value = row[valueField].ToString()
        });
    }

    return new SelectList(list, "Value", "Text");
}
4 голосов
/ 28 декабря 2010
    public static System.Web.Mvc.SelectList DT2SelectList(DataTable dt, string valueField, string textField){            
        if (dt == null || valueField == null || valueField.Trim().Length == 0
            || textField == null || textField.Trim().Length ==0)
            return null;


        var list = new List<Object>();

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            list.Add(new
            {
                value = dt.Rows[i][valueField].ToString(),
                text = dt.Rows[i][textField].ToString()
            });
        }
        return new System.Web.Mvc.SelectList(list.AsEnumerable(), "value", "text");
    }

Я написал это для тебя

2 голосов
/ 17 сентября 2009

Предполагая, что ваш DataTable имеет 2 столбца (текст и значение), вам нужно

1. Set the DropDownList's DataSource to the table
2. Set the DataTextField to the text column name
3. Set the DataValueField to the value column name
4. Call the Databind method
1 голос
/ 07 января 2018

Datatable содержит метод расширения AsDataView . Вы можете использовать этот метод расширения для заполнения SelectList из DataTable. Образец кода:

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add("1", "test");
//populate selectlist with DataTable dt
var selectList = new SelectList(dt.AsDataView(), "Id", "Name");

Здесь Id в SelectList - это столбец selectedValue , а Name - столбец DisplayMember .

1 голос
/ 17 сентября 2009

Вот то, что я придумал, похоже, работает хорошо, но мне было интересно, если это лучший способ.

Сначала я создал объект, который выглядит как мои результаты из моего запроса,

public class MyTestObj
{
    public string Value_CD { get; set; }
    public string Text_NA { get; set; }
}

Затем я создаю ILIST и заполняю его строками с данными.

IList<MyTestObj> MyList = new List<MyTestObj>();
foreach (DataRow mydataRow in myDataTable.Rows)
{
  MyList.Add(new MyTestObj()
  {
    Value_CD = mydataRow["Value"].ToString().Trim(),
    Text_NA  = mydataRow["Text"].ToString().Trim()                      
  });
}

return new SelectList(MyList, "Value_CD", "Text_NA");

Есть какие-нибудь комментарии по этому подходу?

0 голосов
/ 18 февраля 2019

Полностью в строке ответа 'Dot Net Developer', я добавляю свою полную реализацию его / ее решения:

 /// <summary>
    /// retrieve the document types from the database
    /// </summary>
    /// <returns></returns>
    private SelectList FillDocumentTypes()
    {
        SqlCommand command = null;
        SqlConnection _sqlcon = null;
        SelectList result = null;
        try
        {
            _sqlcon = new SqlConnection(connectionString);
            string commandText = string.Concat("select Code, [Description] from tblC2scDocumentTypeCodes");

            command = new SqlCommand(commandText, _sqlcon);
            _sqlcon.Open();
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandText, _sqlcon);

            DataTable dataTable = new DataTable();

            dataTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(dataTable);

            //populate selectlist with DataTable dt
            result = new SelectList(dataTable.AsDataView(), "Code", "Description");

            _sqlcon.Close();
            return result;

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);
          }
        finally
        {
            command.Dispose();
            _sqlcon.Dispose();
        }

    }
0 голосов
/ 19 июля 2017

Слишком поздно для меня, чтобы ответить, но я думаю, что это может быть оптимизированный способ сделать это, надеюсь, это сработает.

List<SelectListItem> listName= new List<SelectListItem>();

for (int i = 0; i < datatableName.Rows.Count; i++)
   {
     listName.Add(new SelectListItem { Text = datatableName.Rows[i]["ColumnName"].ToString(), Value = datatableName.Rows[i]["ColumnName"].ToString() });
   }

Вы также можете циклически просматривать имена столбцов, применив другой цикл и используя его в качестве индекса в идентификаторе столбца таблицы данных.

Спасибо.

0 голосов
/ 17 сентября 2009

выглядит хорошо. Я бы сделал это немного чище, создав конструктор для MyTestObj, который принимает DataRow. Это позволит вам написать:

MyList.Add(new MyTestObj(mydataRow));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...