使用LINQ获取DataGridView行索引,其中第一列具有特定值

时间:2014-06-06 14:15:48

标签: c# linq datagridview

我想获取DataGridViewRow的索引,其第一列的值匹配。

到目前为止我的代码:

string SearchForThis = "test";

int index = from r in dgv.Rows
            where r.Cells[0].Value == SearchForThis
            select r.Index;

编译错误:

找不到源类型的查询模式的实现' System.Windows.Forms.DataGridViewRowCollection'。 '凡'未找到。考虑明确指定范围变量的类型' r'。

2 个答案:

答案 0 :(得分:9)

DataGridViewRowCollection没有实现IEnumerable<T>,这就是为什么你不能使用LINQ,使用Enumerable.Cast方法。

int index = (dgv.Rows.Cast<DataGridViewRow>()
                    .Where(r => r.Cells[0].Value == SearchForThis)
                    .Select(r => r.Index)).First();

或使用查询语法:

int index = (from r in dgv.Rows.Cast<DataGridViewRow>()
            where r.Cells[0].Value == SearchForThis
            select r.Index).First();

您需要从集合中返回一个结果,这就是我使用First的原因,但请记住,如果没有符合条件的项目,它将抛出异常。要克服这一点,请在答案结束时看到解决方案。

请参阅:Enumerable.Cast<TResult> Method

  

Cast<TResult>(IEnumerable)方法启用标准查询   通过提供在非泛型集合上调用的运算符   必要的类型信息。例如,ArrayList没有   实现IEnumerable<T>,但通过调用   Cast<TResult>(IEnumerable)对象上的ArrayList标准   然后可以使用查询运算符来查询序列。

(您也可以使用Enumerable.OfType方法,忽略所有不是DataGridViewRow的方法,但使用DataGridView方法,Cast也可以使用

您还可以使用FirstOrDefault先获取行,然后获取索引:

int index = 0;
var item = dgv.Rows.Cast<DataGridViewRow>()
                    .FirstOrDefault(r => r.Cells[0].Value == (object)1);
if (item != null)
    index = item.Index;

答案 1 :(得分:0)

我一般都喜欢这些形式,(虽然Rows不是一个合适的集合这一事实在语法上很烦人):

 var hit = dgv.Rows.Cast<DataGridViewRow>().First(row => row.Cells["MyColumnName"].Value.Equals(MyIndexValue));

 var hit = dgv.Rows.Cast<DataGridViewRow>().FirstOrDefault(row => row.Cells["MyColumnName"].Value.Equals(MyIndexValue));

如果你只想要第一个,那就更简单了:

 var hit = dgv.Rows.Cast<DataGridViewRow>().First(row => row.Cells[0].Value.Equals(MyIndexValue));