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