使用Linq从DataGridView中选择多行

时间:2016-03-07 00:57:47

标签: c# linq datagridview

我正在尝试从DataGridView中选择多行,而不是使用for-each循环进行迭代。

我可以使用以下代码选择1个项目:

DataGridViewRow row2 =
     (from DataGridViewRow r in dgView.Rows
     where r.Cells["name"].Value.ToString().Equals("Akins Ford")select r).FirstOrDefault();

但是当我尝试选择多行时,请使用以下代码:

List<DataGridViewRow> rows2 =
      (from DataGridViewRow r in dgView.Rows
       where r.Cells["status"].Value.ToString().Equals("active")select r);

我收到了一个错误:

  

错误2无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.List'。存在显式转换(您是否缺少演员?)C:\ Software \ Json \ Json \ Form1.cs 188 18 Json

1 个答案:

答案 0 :(得分:3)

您需要对结果进行简单的包装:

List<DataGridViewRow> rows2 =
        new List<DataGridViewRow>
        (from DataGridViewRow r in dgView.Rows
         where r.Cells["status"].Value.ToString().Equals("active")
         select r);

这是因为linq代码返回IEnumerable<T>而不是List<T>。但您可以通过调用相应的构造函数从List<T>创建IEnumerable<T>

var list = new List<T>(iEnumerable);

为了防止空引用异常,您可能希望进一步改进代码:

List<DataGridViewRow> rows2 =
        new List<DataGridViewRow>
        (from DataGridViewRow r in dgView.Rows
         where r.Cells["status"]?.Value.ToString().Equals("active")??false
         select r);

我假设你正在使用允许空传播的VS2015

r.Cells["status"]?.Value.ToString().Equals("active")??false

把'?'在Cells["status"]确保任何空引用导致null之后。然后最后的??false说,如果我们有一个null,我们返回false(即不包括这一行)。