我有一个C#WinForms应用程序,其中包含一个BindingList,其中填充了这样的widget对象:
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.6秒vs <.1s)。它似乎确实有效但我正在试图找出瓶颈在哪里以及如何将其删除。我错过了什么吗?
答案 0 :(得分:4)
从上面的评论中发布答案:您需要在网格和绑定列表之间添加BindingSource。这将允许您在重新加载源列表时暂停绑定,并允许网格延迟渲染,直到数据源完全更新。