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性能)。本文提出的解决方案也会略微提高性能。
非常感谢,通过设置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();