清除BindingList和添加新项缓慢

本文关键字:新项 缓慢 添加 BindingList 清除 | 更新日期: 2023-09-27 17:49:25

我有一个c# WinForms应用程序,它包含一个BindingList,它是由小部件对象填充的,像这样:

BindingList<Widget> widgetsList = new BindingList<Widget>();

一个小部件有三个属性(一个int,一个string和一个bool)并实现了INotifyPropertyChanged。这些小部件像这样被添加到BindingList中:

for (int i = 0; i < 100000; i++) // takes < 1/10 of a second to execute
{
   widgetsList.Add(new Widget(intValue, stringValue, boolValue));
}

最后,我将BindingList设置为DataGridView(实际上是三个DataGridView控件)的数据源:

dataGridView1.DataSource = widgetsList;

这段代码运行良好。但是,如果我的用户在DataGridView中进行更改,然后想要放弃这些更改并重新加载原始数据,我就会遇到问题。现在我有一个按钮来做这件事按钮的Click事件处理程序中的代码看起来像这样:

dataGridView1.Rows.Clear() // very fast
widgetsList.Clear() // also very fast
    for (int i = 0; i < 100000; i++) // takes 18.6 seconds to execute
    {
       widgetsList.Add(new Widget(intValue, stringValue, boolValue));
    }

可以看到,这个循环执行得非常慢(18.6s vs <0.1 s)比上面相同的循环。它似乎确实起作用,但我试图找出瓶颈在哪里,以及如何消除它。我错过什么了吗?

清除BindingList和添加新项缓慢

回复上面的评论:你需要在网格和绑定列表之间添加一个BindingSource。这将允许您在重新加载源列表时挂起绑定,并允许网格延迟渲染,直到数据源完全更新。