DataGridView复选框列“全选”性能

时间:2011-10-03 16:12:05

标签: c# winforms datagridview

我有一个带复选框列的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)。 在编辑时建议的解决方案也会略微提高性能。

5 个答案:

答案 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();