我有这个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事件
答案 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。