【问题标题】:LINQ: find all checked checkboxes in a GridViewLINQ:在 GridView 中查找所有选中的复选框
【发布时间】:2009-08-05 15:12:42
【问题描述】:

考虑下面的当前算法,它遍历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()));
  }
}

这按预期工作:您留下一个完全填充的List&lt;int&gt;

问题:您将如何或可以如何使用 LINQ 重写或改进此算法,以在 GridView 中搜索所有选择/检查了 Checkbox 的行?

【问题讨论】:

    标签: c# asp.net linq webforms ienumerable


    【解决方案1】:

    我很确定您不会从中获得任何性能改进,但它可能会使它稍微更易于阅读:

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

    同样,不确定它是否有所作为。另外,为什么要转换为字符串然后转换为 int?有什么Convert.ToInt32不能为你做的吗?

    【讨论】:

    • 感谢 LC! Convert.ToInt32 应该可以正常工作。也感谢您的改进!
    • 这可能听起来很傻,但请确保您有“使用 System.Linq;”在尝试编写此语句之前到位。我能够在没有抱怨的情况下编写所有 Linq 内容,但是当我尝试执行隐式转换(来自 GridViewRow msgRow)时,编译器抱怨在 GridViewRowCollection 中没有“Cast”的定义,而 Intelli-sense 中没有任何内容告诉我我需要使用。
    【解决方案2】:

    我不确定 Rows 是否是 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>();
    

    我只是在记事本中这样做的,那里可能有编译错误。但这就是你可以用 Linq 做同样事情的方法。

    【讨论】:

    • 是的,看起来和我的一样,但在方法语法和末尾带有ToList(以及显式的泛型类型说明符)。
    • 是的,我看到了。我喜欢我的方法语法,它看起来更干净。
    • 它是无类型的 IEnumerable(从 .NET 4.0 开始)。你想做Rows.OfType&lt;GridViewRow&gt;().Where()...
    【解决方案3】:

    我有类似的东西,但我在不止一个地方使用它,所以我创建了一个扩展方法。

    public static void ActOnCheckedRows(this GridView gridView, string checkBoxId, Action<IEnumerable<int>> action)
    {
       var checkedRows = from GridViewRow msgRow in gridView.Rows
                         where ((CheckBox)msgRow.FindControl(checkBoxId)).Checked
                         select (int) gridView.DataKeys[msgRow.RowIndex].Value;
    
        action(checkedRows);
    }
    

    所以现在我可以对所有选中的行做一些事情。编译器非常擅长推导类型,但有时我需要将 checkRows 显式声明为 IEnumerable 类型。

    gvTasksToBill.ActOnCheckedRows("RowLevelCheckBox", checkedRows =>
    {
        foreach (int id in checkedRows)
        {
           // do something with id
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 1970-01-01
      • 2012-04-10
      • 2016-06-05
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2011-06-04
      相关资源
      最近更新 更多