使用linq搜索与数据表绑定的CheckedListBox

时间:2016-10-13 13:36:43

标签: c# linq

我有一个CheckedListBox(winforms),其数据绑定到数据表:

clbCustomer.DataSource = ds.Tables["Default"];
clbCustomer.DisplayMember = "desc";
clbCustomer.ValueMember = "customerId";

现在,我想在checkedlistbox中搜索特定的客户ID,然后选择该行。我可以通过以下声明来做到这一点:

// Find the index
int index = 0;
foreach (DataRowView item in clbCustomer.Items)
{
    int cusId = Convert.ToInt32(item["customerId"]);
    if (cusId == 255)
    {
        break;
    }
    index++;
}
// Select the customer
clbCustomer.SetItemChecked(index, true);

然而,这样做似乎非常笨重。我试图将上面的代码转换为linq但无法完成它。以下是我到目前为止的情况:

// Find the index (not working)
int index = clbCustomer.Items.Cast<DataRowView>().Where(x => x["customerId"] == 255);
// Select the customer
clbCustomer.SetItemChecked(index, true);

但不确定如何使用linq提取该客户ID的索引。任何帮助,将不胜感激。感谢。

由Keithin8a提供的解决方案:

var item = clbCustomer.Items.Cast<DataRowView>().Where(x => Convert.ToInt32(x["customerId"]) == 255).FirstOrDefault();

int index = clbCustomer.Items.IndexOf(item);

1 个答案:

答案 0 :(得分:2)

像这样的Linq语句返回注释中提到的集合。如果您要使用

var item = clbCustomer.Items.Cast<DataRowView>().Where(x => Convert.ToInt32(x["customerId"]) == 255).FirstOrDefault()

那会让你成为一个单品,而不是一个集合。然后,您可以通过调用

获取此项目的索引
int index = clbCustomer.Items.IndexOf(item);

那应该能得到你想要的东西。