我了解如何使用委托来更新主控制线程上的控件,就像魅力一样。我的问题在于,如果我将大型DataSet
(如2000项)添加到绑定DataGridView
,则需要5-8秒才能填充网格,并且在此期间整个GUI将被锁定5-8秒。我如何更新DataGridView
,使其不锁定用户界面?对DataGridView的无阻塞更新
需要明确的是,这个问题是不是我做了慢速查询到数据库和UI阻止对,我已经有DataSet object[]
和添加对象的数组到BindingList<object>
该DataGrid
是势必使:
BindingList<object> dataProvider = new BindingList<object>();
DataGridView gridView = new DataGridView();
gridView.DataSource = dataProvider;
// ...stuff happens...
object[] source = dataSet; //of 2000 items
foreach (object item in source) { //this foreach blocks
dataProvider.Add(item);
}
我尝试过各种东西(我知道是行不通的,但想我会看到),如创建一个委托,它做了dataProvider.Add()
,但由于它仍然不得不说没有问题发生在控制线程上。
一些好的建议围绕构建BindingList
首先,然后设置gridView.DataSource
。虽然这可以工作(它立即更新网格),但我看到添加更多数据的唯一方法是创建另一个新的BindingList
,执行gridView.DataSource.copyTo()
(获取现有数据)并在其上添加新数据,然后设置gridView.DataSource
到新的BindingList
。这对我不起作用,因为列表中的对象不是静态的,它们每个都将数据异步上传到服务器,并将它们复制到新的BindingList
会导致问题。
foreach循环应该到另一个线程,但是这仍然是个好主意。 – user142350 2009-08-18 20:45:14
这取决于一点,但添加2000项通常可以接受正常事件。我收集他们已经在记忆中。 – 2009-08-18 20:56:17
我试着把foreach循环放在不同的线程中,但是这并没有帮助,因为每个.Add都必须在控制线程上发生,这意味着整个foreach仍然在控制线程上发生。 Henk是正确的,如果我将所有项目添加到BindingList,然后将gridView.DataSource设置为BindingList,然后立即更新。这里的问题是,如果我想添加更多的项目到gridView我必须创建一个新的BindingList,复制所有现有的项目,并添加更多。这打破了我在当前数据上运行的任何操作(并且感觉像是黑客)。 – Shizam 2009-08-18 21:01:09