我有一个带复选框列的DataGridView。我正在尝试创建一个选择/取消选择所有按钮。更改值的代码很容易,但性能很糟糕。
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells["Selected"].Value = _selectAll;
}
_selectAll只是一个toggle bool变量。在性能快速的情况下,有更好的方法吗?我也试过更改底层DataTable中的值。只需要几百行,它仍然需要几秒钟,但大多数工作将在数千行上完成。
编辑&amp;解决方案(2011/10/4)
主要问题在于DGV属性。一旦我设置,
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
性能显着提高(每MSDN DataGridView Performance)。 在编辑时建议的解决方案也会略微提高性能。
答案 0 :(得分:6)
非常感谢,设置AutoSizeColumnsMode
属性
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
表现要好得多......
答案 1 :(得分:1)
嗯,这是一个常见的问题。
首先,您是否有与Checkbox检查更改相关的任何处理?
如果是这样,请创建一个bool成员变量
在执行全选/取消全选之前将其初始化为false。
在CheckBox中选中的更改事件 - &gt;检查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
}
答案 2 :(得分:0)
不确定您是否会获得性能提升,但您还可以尝试其他方式:
for (int i = 0; i < dgv.RowCount; i++)
{
dgv["Selected", i].Value = _selectAll;
}
答案 3 :(得分:0)
您可以指定它所属的列,而不是给出gridview列名称。这样可以更快地运行。希望它有所帮助。
for (int i = 0; i < dgv.RowCount; i++)
{
dgv.Rows[i].Cells[4].Value = _selectAll;
}
答案 4 :(得分:0)
我展示了另一种改善这个问题的方法
像dgv.Rows[i].Cells["Selected"].Value
一样直接访问datagridview会使datagridview变慢。
因此,如果您的datagridview具有数据源并且数据已检查状态,则更改数据源并刷新datagridview可以使匹配更好。
foreach (var item in yourDataSource)
{
item.Checked = _selectAll;
}
dgv.Invalidate();