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

本文关键字:组合 转换 LINQ 数据集 使用 | 更新日期: 2023-09-27 18:24:11

我正在尝试获取一个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只有一项:"System.Linq.Enumerable".

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

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

如果cmbCauseForRepair.Items.Add()有一个重载,它接受值的枚举,那么你就不需要了。但它没有。它只接受一个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);

或者使用不同的方法添加它们:

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

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

尝试相同的方法,但使用.AddRange(),它将Object的集合添加到ComboBox:

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

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

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