C# DataGridView 检测全选按钮

Posted

技术标签:

【中文标题】C# DataGridView 检测全选按钮【英文标题】:C# DataGridView detecting select all button 【发布时间】:2018-02-15 10:45:52 【问题描述】:

我正在开发一个 C# Windows 窗体程序,并在其上实现了一个 DataGridView。现在,在设置数据源之后,当我单击 datagridview 上的左上角按钮时,它会选择所有行,就像 Microsoft Excel 一样。但是,我动态隐藏和显示其上的行,单击该按钮后,我意识到它还选择了 不可见的。 我不想实现“SelectionChanged”事件,因为我不断选择一些行通常我不能选择不可见的。只有这个按钮选择它。我正在寻找这样的活动:

datagridView1_SelectAllClicked(object sender, EventArgs e)

     // do stuff

这样的方法也可以,因为我不必检查所有选择:

dataGridView1_SelectionChanged(object sender, EventArgs e)

     if(dataGridView1.IsSelectAllCells())
     
          // do stuff
     

如果必须,我将添加事件以取消选择不可见行,但我更喜欢第一个解决方案。有什么建议吗?提前致谢。

编辑:我只在单击按钮时检查“dataGridView1.SelectedRows”属性,而不是在进行选择之后。所以,我可以为按钮点击事件实现的一些功能也可以解决我的问题。

【问题讨论】:

【参考方案1】:

DataGridView 类提供了AreAllCellsSelected 方法:

返回一个值,该值指示当前是否选择了所有 DataGridView 单元格。 (MSDN)

有了它,我们可以获得像您的第二个这样的解决方案:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)

    DataGridView view = sender as DataGridView; 

    if (view.AreAllCellsSelected(true))
    
        foreach (DataGridViewRow row in view.Rows)
        
            //deselect all invisible rows
            if (!row.Visible)
                row.Selected = false;
        
    

【讨论】:

虽然这工作正常,但我真的不想实现该事件,因为我不必检查其他选择,因为它们已经不可见。此事件捕获所有选择类型:列、行和单元格特定。除了全选按钮之外,它只会触发。如果有更有效的方法,我想使用它而不是这个,因为我认为这种方法会循环遍历所有单元格,在我的情况下这将是低效的。【参考方案2】:

我终于设法解决了,解决方案比我预期的要简单。

private void RemoveInvisibleSelection()

     if (dataGridView1.SelectedRows.Count == dataGridView1.Rows.Count)
     
         for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
             if (!dataGridView1.SelectedRows[i].Visible)
                 dataGridView1.SelectedRows[i--].Selected = false; // decreased the index value since SelectedRows property loses an object
     

【讨论】:

以上是关于C# DataGridView 检测全选按钮的主要内容,如果未能解决你的问题,请参考以下文章

Winform datagridview checkbox全选问题

C#中 如何给Datagridview添加一列checkbox

C#重绘DataGridView行

C# 中 datagridview 绑定BindingList类型和更新

DataGridView 动态绑定 CheckBox

C# WinForm下DataGridView单元按钮列