LINQ:在GridView中找到所有选中的复选框

p.c*_*ell 12 c# linq asp.net ienumerable webforms

考虑下面的当前算法迭代GridView一行的行来查找是否Checkbox选中/检查了包含的内容.

List<int> checkedIDs = new List<int>();

foreach (GridViewRow msgRow in messagesGrid.Rows)
{
  CheckBox chk = (CheckBox)msgRow.FindControl("chkUpdateStatus");
  if (chk.Checked){
   //we want the GridViewRow's DataKey value
   checkedMsgIDs.Add(int.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString()));
  }
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作:你留下了一个完全填充List<int>.

问题:您如何使用LINQ重新编写或改进此算法以搜索GridViewCheckbox选择/检查过的所有行?

lc.*_*lc. 20

我敢肯定你不会从此获得任何性能改进,但它可能会使它稍微更易于阅读:

var checkedIDs = from GridViewRow msgRow in messagesGrid.Rows
                 where ((CheckBox)msgRow.FindControl("chkUpdateStatus")).Checked
                 select Int32.Parse(messagesGrid.DataKeys[msgRow.RowIndex].Value.ToString());
Run Code Online (Sandbox Code Playgroud)

再次,不确定它是否有所作为.另外,为什么要转换为字符串然后转换为int?有什么东西Convert.ToInt32不能帮你吗?


Dav*_*rab 9

我不确定行是否是IEnumerable它们可能不是,但我会假设它们是

List<int> checkedIDs = messagesGrid.Rows
  .Where<GridViewRow>(i => (CheckBox)i.FindControl("chkUpdateStatus").Checked)
  .Select<GridViewRow, int>(i => return int.Parse(messagesGrid.DataKeys[i.RowIndex].Value.ToString()))
  .ToList<int>();
Run Code Online (Sandbox Code Playgroud)

我只是在记事本中这样做,那里可能存在编译错误.但这就是你如何用Linq做同样的事情.