交换BindingList< SomeClass>元素需要很多时间,为什么会这样,我应该怎么做

本文关键字:为什么 我应该 时间 SomeClass BindingList 元素 交换 | 更新日期: 2023-09-27 18:15:05

我正在编写一个小的c#应用程序,主要是为了好玩,并且有一个DataGridView来显示一些数据,它被绑定到BindingList。乐趣始于我决定使表格可排序的那一刻,这就是使用BindingList的原因。据我所知,在BindingList中没有这方面的标准实现,但是msdn有一篇文章介绍了这一点(关于为BindingList实现排序和查找)。长话短说,在它们的实现中很少有行会引起麻烦:

SomeClass tmp;
for(...)
{
    tmp = this[i]; //fast
    this[i] = this[position]; //slow
    this[position] = tmp; //slow
}

如注释所示,第一个作业不花太多时间,但另外两个作业真的很慢。我不明白这背后的原因,但因为它排序列表50个左右的元素大约需要两秒钟。我可以用一些变通办法,但看起来有点难看。另外,我很想知道是什么原因导致了这样的行为。

交换BindingList< SomeClass>元素需要很多时间,为什么会这样,我应该怎么做

速度变慢是因为赋值会导致绑定到该列表的任何内容重新绘制(例如,DataGridView)。

你应该修改你的排序方法,当列表被改变时禁用引发事件。

var origRaiseEvents = this.RaiseListChangedEvents;
this.RaiseListChangedEvents = false;
try
{
    // here goes your original code.
}
finally
{
    this.RaiseListChangedEvents = origRaiseEvents;
}

主要问题是,如果这是BindingList,则DataGridView将在每次设置BindingList中的任何内容时尝试更新。这意味着您标记为慢的两行很可能本身并不慢,而是因为它们触发DataGridView刷新而慢,这意味着它在排序操作中刷新了许多次。

您可以通过封装BindingList而不是子类化它来解决这个问题,并且在排序期间不引发事件,而是等到排序完成,然后刷新整个列表。