使用LINQ将数据集转换为组合框项目

时间:2014-09-24 17:45:35

标签: c# linq ienumerable

我正在尝试DataSet并将每个项目添加到ComboBox

我目前正在使用foreach循环,如下所示:

 foreach (DataRow row in ds.Tables[0].Rows)
 {
     cmbCauseForRepair.Items.Add(row[0].ToString() + ":" + row[1].ToString());
 }

我想使用LINQ。

以下是我的尝试:

     cmbCauseForRepair.Items.Add(from r in ds.Tables[0].Rows.Cast<DataRow>()
                              select r[0] + ":" + r[1]);

但是,我的ComboBox只有1项:&#34; System.Linq.Enumerable&#34;。

3 个答案:

答案 0 :(得分:1)

.Add()只会添加一个项目。

尝试使用相同的方法,但请使用.AddRange(),这会将Object的{​​{1}}添加到ComboBox

cmbCauseForRepair.Items.AddRange(from r in ds.Tables[0].Rows.Cast<DataRow>()
                                 select r[0] + ":" + r[1]);

答案 1 :(得分:1)

LINQ不会为您循环记录。你仍然需要这样做。

如果cmbCauseForRepair.Items.Add()的重载接受了枚举值,那么您就不需要了。但它并没有。它只接受an object。根据该文档,该对象将被视为:

  

项目的直观表示显示在组合框中。此内容表示由DisplayMember属性指定。如果DisplayMember属性为null,则调用项的ToString方法以获取组合框中显示的字符串;否则,将显示DisplayMember属性指定的存储对象的属性。

由于传递给Add()的对象属于IEnumerable<string>类型,因此其.ToString()表示形式为:

`IEnumerable<string>`

基本上,您需要遍历对象以一次添加一个:

var items = from r in ds.Tables[0].Rows.Cast<DataRow>()
            select r[0] + ":" + r[1];
foreach (var item in items)
    cmbCauseForRepair.Items.Add(item);

或使用a different method添加它们:

cmbCauseForRepair.Items.AddRange(from r in ds.Tables[0].Rows.Cast<DataRow>()
                                 select r[0] + ":" + r[1]);

答案 2 :(得分:0)

最好使用string.Format而不是串联字符串

cmbCauseForRepair.Items.AddRange(ds.Tables[0].Rows.Cast<DataRow>().Select(p => string.Format("{0}:{1}", p[0], p[1])).ToArray());
相关问题