交换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个左右的元素大约需要两秒钟。我可以用一些变通办法,但看起来有点难看。另外,我很想知道是什么原因导致了这样的行为。
速度变慢是因为赋值会导致绑定到该列表的任何内容重新绘制(例如,DataGridView)。
你应该修改你的排序方法,当列表被改变时禁用引发事件。
var origRaiseEvents = this.RaiseListChangedEvents;
this.RaiseListChangedEvents = false;
try
{
// here goes your original code.
}
finally
{
this.RaiseListChangedEvents = origRaiseEvents;
}
主要问题是,如果这是BindingList
,则DataGridView
将在每次设置BindingList
中的任何内容时尝试更新。这意味着您标记为慢的两行很可能本身并不慢,而是因为它们触发DataGridView
刷新而慢,这意味着它在排序操作中刷新了许多次。
您可以通过封装BindingList
而不是子类化它来解决这个问题,并且在排序期间不引发事件,而是等到排序完成,然后刷新整个列表。