代码之家  ›  专栏  ›  技术社区  ›  Tony Borf

从数据表填充SelectList

  •  3
  • Tony Borf  · 技术社区  · 16 年前

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

    myDataAdapter.Fill(myDataTable);
    

    现在,将行值“value”和“text”加载到selectlist中的最佳方法是什么?

    谢谢

    8 回复  |  直到 7 年前
        1
  •  7
  •   Emond    13 年前

    我找不到将数据表直接绑定到selectlist的方法,因此我决定创建一个扩展方法来完成此任务:

    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");
    }
    
        2
  •  4
  •   kinogam    15 年前
        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");
        }
    

    我给你写的这个

        3
  •  2
  •   o.k.w    16 年前

    假设数据表有两列(文本和值),则必须

    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
    
        4
  •  1
  •   Tony Borf    16 年前

    这就是我想出来的,它似乎工作得很好,但我想知道这是不是最好的方法。

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

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

    对此方法有何评论?

        5
  •  1
  •   Dot Net developer    8 年前

    数据表包含扩展方法 ASDATAVIEW .可以使用此扩展方法从数据表中填充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");
    

    在这里 身份证件 选择列表 选择值 列和 名字 显示值 列。

        6
  •  0
  •   Jason Berkan whiteproud    16 年前

    看起来很好。通过为接受数据行的mytestobj创建一个构造函数,我可以让它更清晰一些。这样你就可以写:

    MyList.Add(new MyTestObj(mydataRow));
    
        7
  •  0
  •   Rahul Bhat    9 年前

    我现在回答还为时已晚,但我认为这可能是一种优化的方法,希望它能奏效。

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

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

    谢谢您。

        8
  •  0
  •   real_yggdrasil    7 年前

    完全按照“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();
            }
    
        }
    
    推荐文章