DataGridView 复选框列的 "全选" 性能问题

7

我有一个带有复选框列的DataGridView。我试图创建一个全选/取消全选的按钮。更改值的代码很容易,但性能非常糟糕。

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

_selectAll只是一个开关布尔变量。是否有更好的方法可以使其性能更快?我也尝试过在底层数据表中更改值。即便如此,在仅有数百行的情况下仍需数秒钟才能完成,但大部分工作将在数千行上完成。
编辑和解决方案(2011/10/4)
主要问题出在DGV属性上。一旦我设置了,
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

性能得到了显著改善(参见MSDN DataGridView Performance)。 截至目前,建议的解决方案也会略微提高性能。


1
尝试通过索引而不是名称访问列,例如:dgv.Rows[i].Cells[1].Value = _selectAll; - Igby Largeman
你的网格控件是否绑定到任何属性,还是直接在代码后台中设置? - Nivid Dholakia
1
你确定瓶颈就在那里吗?我认为问题出在其他地方。 - Steve Wellens
@Steve Wellens:啊哈!原来问题出在DGV属性上。根据http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx,'dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;'解决了这个问题。请将此作为答案发布以供未来的查看者参考。 - Handprint
太棒了,你的工作救了我一命。 ;) - VJOY
5个回答

7
非常感谢您,通过设置AutoSizeColumnsMode属性来实现。
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

性能比以前要好得多...


1

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

这似乎是所提出的解决方案中最完整的。请注意我的问题中的编辑,它解决了性能差的主要原因。 - Handprint

0

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

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

0

不要给出gridview的列名,可以指定它属于哪一列。这样会更快。希望能帮到你。

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

0
我展示了另一种改进这个问题的方法。
直接访问datagridview,如dgv.Rows[i].Cells["Selected"].Value会使datagridview变慢。
因此,如果您的datagridview具有数据源并且数据源已经检查了状态,则更改数据源并刷新datagridview可以获得更好的性能匹配。
foreach (var item in yourDataSource)
{
    item.Checked = _selectAll;
}
dgv.Invalidate();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接