从DataTable填充SelectList

时间:2009-09-17 14:52:23

标签: c# asp.net asp.net-mvc

我运行了一个查询并返回了一个数据表,

myDataAdapter.Fill(myDataTable);

现在将行值“Value”和“Text”加载到SelectList中的最佳方法是什么?

由于

8 个答案:

答案 0 :(得分:7)

我找不到直接将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");
}

答案 1 :(得分:4)

    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 :(得分:2)

假设您的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

答案 3 :(得分:1)

这是我想出来的似乎运作良好,但我想知道这是否是最佳方式。

首先,我创建了一个看起来像我的查询结果的对象

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");

对此方法有何评论?

答案 4 :(得分:1)

Datatable包含扩展方法 AsDataView 。您可以使用此扩展方法从DataTable填充SelectList。代码示例:

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");

SelectList 中的 Id selectedValue 列,名称 DisplayMember 专栏。

答案 5 :(得分:0)

看起来很好。我会通过为MyTestObj创建一个接受DataRow的构造函数来使它更清晰。这将允许你写:

MyList.Add(new MyTestObj(mydataRow));

答案 6 :(得分:0)

我现在回答太晚了,但我认为这可能是一种优化的方式,希望它有效。

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() });
   }

您也可以通过应用另一个循环并将其作为数据表的列标识符的索引来循环遍历列名。

谢谢。

答案 7 :(得分:0)

在“ 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();
        }

    }