【问题标题】:Clear BindingList and add new items is slow?清除 BindingList 并添加新项目很慢?
【发布时间】:2012-12-21 18:28:58
【问题描述】:

我有一个 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.6 秒 vs

【问题讨论】:

  • 不是简单地清除widgetsList,如果你真的创建了一个新实例呢?我已经看到其他对象即使在清​​除后仍保留内部缓冲区,也许这会清除它。另一个想法是删除网格上的数据源,或者至少暂停绑定。它可能会在每次添加后尝试渲染,而第一个循环不会因为它在被设置为数据源之前发生。
  • 你是对的!这是绑定。我必须在 BindingList 和 DataGridView 之间添加一个绑定源才能使其正常工作,但这允许我在重新加载原始数据时暂停绑定,它解决了我的问题。如果您想将此作为答案发布,我很乐意接受。谢谢!

标签: c# datagridview bindinglist


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多