Заполнение 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 .