DataGridView复选框列"选择全部"表演

本文关键字:quot 全部 表演 选择 复选框 DataGridView | 更新日期: 2023-09-27 18:10:15

我有一个DataGridView与复选框列。我试图创建一个选择/取消选择所有按钮。修改值的代码很简单,但是性能很差。

for (int i = 0; i < dgv.RowCount; i++)
{
    dgv.Rows[i].Cells["Selected"].Value = _selectAll;
}

_selectAll只是一个切换bool变量。有没有更好的方法可以让性能更快呢?我也试过改变底层数据表中的值。几百行仍然需要几秒钟,但大多数工作将在数千行上完成。

编辑,解决方案(2011/10/4)

主要问题在于DGV属性。一旦我设置

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

性能显著提高(根据MSDN DataGridView性能)。本文提出的解决方案也会略微提高性能。

DataGridView复选框列"选择全部"表演

非常感谢,通过设置AutoSizeColumnsMode属性

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

嗯,这是一个常见的问题。
首先,您是否有任何与选中更改的复选框相关的处理?
如果是,则创建bool成员变量。
在执行全选/取消全选之前,将其初始化为false。
在复选框中选中更改事件->检查bool参数的值。
如果它从事件返回错误。不要处理任何东西。
在完成for循环设置全选/取消全选后,如果需要,处理选中的更改事件。
不要忘记在for循环后将bool参数重置为true。

bool _allowProcessing = false;
//SelectAll / Deselect All
for (int i = 0; i < dgv.RowCount; i++)
{
   dgv.Rows[i].Cells[4].Value = _selectAll;
}
_allowProcessing = true;
// Do some processing if required
// Checked change event
public void CheckBox_CheckedChange(object sender, eventArgs e)
{
  if(!_allowProcessing)
    return;
  // Do Processing
}

不确定是否会获得性能提升,但您可以尝试其他方法:

for (int i = 0; i < dgv.RowCount; i++)
{
    dgv["Selected", i].Value = _selectAll;
}

可以指定它属于哪个列,而不是给出gridview的列名。这将工作得更快。希望能有所帮助。

for (int i = 0; i < dgv.RowCount; i++)
{
   dgv.Rows[i].Cells[4].Value = _selectAll;
}

我展示了另一种改进这个问题的方法。
dgv.Rows[i].Cells["Selected"].Value那样直接访问datagridview会使datagridview变慢。

所以,改变数据源和刷新datagridview使匹配更好的性能,如果你的datagridview有数据源和数据源已检查状态。

foreach (var item in yourDataSource)
{
    item.Checked = _selectAll;
}
dgv.Invalidate();