Intereting Posts
ASP: ListBox Получить выбранные элементы – один лайнер? Захват двойного касания на сенсорном экране .NET4.0: Thread-Safe для обновления словаря и его значений Файл .deploy не развертывает XML-файл Отправить SMTP-адрес электронной почты с помощью System.Net.Mail через Exchange Online (Office 365) Как удалить последнюю строку в текстовом файле? Как использовать локальную переменную как тип? Компилятор сказал, что «это переменная, но используется как тип» Ядро Entity Framework в Windows IoT, запущенном на RPi 3 (консольное приложение) SQLCLR и DateTime2 Добавьте одно пробел после каждого двух символов и добавьте символ infront каждого отдельного символа Различия между клиентами webservice, написанными на .net2.0 и .net4.0 .NET Web Service & BackgroundWorker threads C #: Как словарь реализовать ICollection <KeyValuePair > без добавления (KeyValuePair )? Внедрение нескольких общих интерфейсов – ошибка типа Linq различный метод только для определенного свойства

Заполнение SelectList из DataTable

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

myDataAdapter.Fill(myDataTable); 

Теперь, как лучше всего загрузить значения строк «Значение» и «Текст» в SelectList?

Спасибо

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

 public static SelectList ToSelectList(this DataTable table, string valueField, string textField) { List list = new List(); foreach (DataRow row in table.Rows) { list.Add(new SelectListItem() { Text = row[textField].ToString(), Value = row[valueField].ToString() }); } return new SelectList(list, "Value", "Text"); } 
  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(); 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"); } 

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

Предполагая, что ваш 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 

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

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

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

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

 IList MyList = new List(); 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"); 

Любые комментарии по этому подходу?

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

 MyList.Add(new MyTestObj(mydataRow)); 

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

 List listName= new List(); 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() }); } 

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

Благодарю вас.

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 – это выбранный столбец Value, а Name – столбец DisplayMember .