清除BindingList并添加新项目很慢?

我有一个C#WinForms应用程序,其中包含一个BindingList,其中填充了这样的小部件对象:

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

小部件具有三个属性(一个int,一个字符串和一个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. .1s).它的确起作用了,但是我试图弄清楚瓶颈在哪里以及如何消除它.我想念什么吗?

解决方法:

从上面的评论中发布答案:您需要在网格和绑定列表之间添加BindingSource.这将允许您在重新加载源列表时挂起绑定,并允许网格推迟渲染,直到完全更新数据源为止.

上一篇:c#-将Excel数据导入Visual Studio 2010中的DataGridView


下一篇:在datagridview中过滤数据C#