交换BindingList <someclass>元素需要花费大量时间,为什么这样做,我应该怎么做?</someclass>

时间:2013-05-22 17:37:21

标签: c# list variable-assignment

我正在写小C#应用程序主要是为了好玩,并且有一个DataGridView来显示一些数据,它绑定到BindingList。从我决定使表可排序的那一刻开始,这就是使用BindingList的原因。据我所知,BindingList中没有标准的实现,但msdn有文章介绍这个(about implementing sort and find for BindingList)。长话短说,实施中几行引起麻烦:

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

正如评论所示,第一项任务并不需要花费太多时间,但其他两项工作确实很慢。我无法理解它背后的原因,但由于它排序列表50左右的元素需要大约两秒钟。 好吧,我可以使用一些解决方法,但它似乎有点难看。此外,我真的想知道导致这种行为的原因。

2 个答案:

答案 0 :(得分:1)

主要问题(如果是BindingList)是每次在DataGridView内设置任何内容时,BindingList都会尝试更新。这意味着您标记为慢速的两条线很可能不会慢,但速度慢,因为它们会触发DataGridView刷新,这意味着它会在排序操作中刷新很多次。

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

答案 1 :(得分:1)

发生减速是因为赋值会导致绑定到该列表的任何内容重绘(例如,DataGridView)。

您应该修改排序方法,以便在更改列表时禁用引发事件。

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