使用DataGridView Combobox事件和linq查询无法正常工作

时间:2012-05-25 19:21:24

标签: c# linq

我有这个linq查询,不知道它为什么不起作用。 itemDetails是我的Datatable。我是初学者。

我想要的是在datagridview组合框字段中选择项目时获取项目的itemID。

1)一个问题是我在下面写的linq查询。

    from r in itemDetails
    where r.ItemName = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()
    select r.ItemID;

出现以下错误

  

无法找到源类型的查询模式的实现   'System.Data.DataTable'。 '哪里'找不到。

2)另一个问题是我如何处理datagridview combobox selectedIndexchanged事件

1 个答案:

答案 0 :(得分:1)

您遇到的问题是DataTable不是IEnumerable类,这意味着您将无法使用Linq方法。这就是编译器抱怨的内容;你编写的Linq查询被编译成一系列方法调用,编译器希望找到一个可以在DataTable上调用的Where()方法来执行where子句的过滤,而找不到。

但是,它的Rows属性是IEnumerable(但不是通用的,所以你需要使用OfType()方法来创建一个IEnumerable的DataRows):

from r in itemDetails.Rows.OfType<DataRow>()
where r.ItemName == dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()
select r.ItemID;

现在,最重要的是,DataRow没有ItemName和ItemID属性。您没有以这种方式从DataRow获取值。编译器并没有在你的代码中抱怨它(因为它甚至不知道r的类型是什么,所以它无法确定该类型的对象是否具有这些成员。一旦指定r是DataRow,编译器就会发现其他错误。

要解决此问题,您需要使用DataRow上可用的索引器。您可以通过索引引用列(从左到右基于从水合DataTable的查询的选择列表从零开始),或者通过列名称(再次基于列的名称或您给它们的别名)在选择列表中):

from r in itemDetails.Rows.OfType<DataRow>()
where r["ItemName"].ToString() == dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()
select (int)r["ItemID"];

索引器生成的项目是Object类型;你需要将它们转换或转换为正确的类型(例如,我假设ItemName是一个String,而ItemId是一个32位整数)。

至于您的第二个问题,DataGridViews不会公开其包含控件的大多数事件。相反,这些控件被挂钩,并导致DGV触发您可以处理的事件。看一下CellValueChanged事件和/或CellDirtyStatusChanged事件。当用户更改单元格的值然后该单元格失去焦点时,将引发第一个。在提交实际发生之前,一旦对单元格的值进行了第一次更改,就会引发CellDirtyStatusChanged。