c# - 清除 BindingList 和添加新项目很慢?

标签 c# datagridview 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.6 秒对 < .1 秒)比上面的相同循环慢得多。它似乎确实有效,但我试图弄清楚瓶颈在哪里以及如何消除它。我错过了什么吗?

最佳答案

发布上面评论的答案:您需要在网格和绑定(bind)列表之间添加一个 BindingSource。这将允许您在重新加载源列表时暂停绑定(bind),并允许网格推迟渲染直到数据源完全更新。

关于c# - 清除 BindingList 和添加新项目很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13995336/

相关文章:

c# - 将 DataGridViewAutoFilter 与 Equin BindingListView 结合使用

winforms - ObservableCollection(Of T) vs BindingList(Of T)?

c# - 重载 true 和 false 运算符有什么作用?

c# - CA1822 : Mark members as static, 当用于不同的程序集时

c# - 向 sqlparameter 类添加更多参数

c# - 如何创建 mysql 更新查询以在 c#.net windows 应用程序的一条语句中更新多行

c# - 修改DataGridView绑定(bind)的大数据集需要很长时间?

C# DataSet.Tables[0].GetChanges();总是返回所有行

c# - TaskCompletionSource 使用

c# - 是否可以以类似于 ListBox 控件的方式将 BindingList<T> 与 ListView 控件一起使用?