2

我正在写一个小的C#应用程序主要是为了好玩,并且有一个DataGridView来显示一些数据,它绑定到BindingList。从我决定让表格可排序的那一刻起,乐趣就开始了,这就是使用 BindingList 的原因。据我了解,在 BindingList 中没有标准的实现,但是 msdn 有文章涵盖了这个(关于实现 BindingList 的排序和查找)。长话短说,在他们的实施中,有几行会引起麻烦:

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

正如评论所示,第一个任务不需要太多时间,但其他两个真的很慢。我不明白它背后的原因,但因为它排序列表 50 左右的元素大约需要两秒钟。好吧,我可以使用一些解决方法,但它似乎有点难看。此外,我真的很想知道是什么导致了这种行为。

4

2 回答 2

2

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

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

var origRaiseEvents = this.RaiseListChangedEvents;
this.RaiseListChangedEvents = false;
try
{
    // here goes your original code.
}
finally
{
    this.RaiseListChangedEvents = origRaiseEvents;
}
于 2013-05-22T17:47:58.710 回答
1

主要问题,如果这是BindingList. ,DataGridView每次您在BindingList. 这意味着您标记为慢的两行很可能本身不会变慢,而是很慢,因为它们触发了DataGridView刷新,这意味着它在排序操作中刷新了很多次。

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

于 2013-05-22T17:44:53.640 回答