我了解如何使用委托来更新主控制线程上的控件,就像一个魅力。我的问题是,如果我将一个大的DataSet
(比如 2000 个项目)添加到一个 boundDataGridView
中,填充网格需要 5-8 秒,并且在这 5-8 秒内整个 GUI 被锁定。如何更新DataGridView
它以使其不锁定用户界面?
需要明确的是,问题不在于我正在对数据库进行慢速查询并且 UI 阻塞了它,我已经有了DataSet object[]
并将对象数组添加到绑定到的 aBindingList<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
会导致问题。