Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理DataGridView组合框事件和linq查询不工作_C#_Linq - Fatal编程技术网

C# 处理DataGridView组合框事件和linq查询不工作

C# 处理DataGridView组合框事件和linq查询不工作,c#,linq,C#,Linq,我有这个linq查询,不知道为什么它不工作。itemDetails是我的数据表。我是初学者 我想要的是在datagridview组合框字段中选择某个项目时,获取该项目的itemID 1) 一个问题是我在下面写的linq查询 from r in itemDetails where r.ItemName = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() select r.ItemID; 它给出了以下错误 找

我有这个linq查询,不知道为什么它不工作。itemDetails是我的数据表。我是初学者

我想要的是在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事件您遇到的问题是DataTable不是IEnumerable类,这意味着您将无法对其使用Linq方法。这就是编译器所抱怨的;您编写的Linq查询被编译成一系列的方法调用,编译器希望找到一个Where()方法,它可以在DataTable上调用该方法来执行Where子句的过滤,但没有找到

但是,它的Rows属性是IEnumerable(但不是泛型,因此需要使用OfType()方法创建DataRows的IEnumerable):

索引器生成的项目为Object类型;您需要将它们转换为适当的类型(例如,我假设ItemName是字符串,ItemId是32位整数)


至于第二个问题,DataGridView不公开其包含控件的大多数事件。相反,这些控件被钩住,并使DGV触发您可以处理的自己的事件。查看CellValueChanged事件和/或CellDirtyStatusChanged事件。当用户更改单元格的值,然后该单元格失去焦点时,会引发第一个问题。CellDirtyStatusChanged会在单元格值的第一次更改后立即引发,直到提交实际发生。

thnx您的回答非常有用。您能否告诉我第二个问题,即如何处理datagridview组合框列的selectedindexchanged事件?我尝试了您的示例,它给出了错误信息无法将类型“object”隐式转换为“bool”。存在显式转换(是否缺少强制转换?)“非常确定问题是单等号(表示赋值,返回被赋值对象的副本)而不是双等号(表示相等,返回布尔值)。
from r in itemDetails.Rows.OfType<DataRow>()
where r.ItemName == dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()
select r.ItemID;
from r in itemDetails.Rows.OfType<DataRow>()
where r["ItemName"].ToString() == dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()
select (int)r["ItemID"];