我有一个DataTable,它将包含大约几千行,每行有大约20个字段。
此外,单元格中的值将更改为实时。此外,一些行将被删除,一些行在运行时添加。
第一个问题我面临的是,当我打开应用程序并调用DataGrid.DataSource = .. DataGrid最初没有显示数据,我必须最小化应用程序和然后把它重新打开以显示数据,为什么会发生这种情况?
第二个问题是每一行都将从一个单独的线程更新。我一直得到'索引损坏'异常然后我发现我无法从单独的线程更新dataTable,因此我创建了一个包含所有单元格的类,创建了List并使得线程直接更新了类数据,然后另一个单线程更新了dataTable,似乎工作正常,但有更好的方法吗?
基本上我需要一个DataGrid,它支持几千行,这些行将被直接更新/删除/添加(通过线程,而不是用户)。完成此任务的最佳方法是什么?
谢谢!
答案 0 :(得分:0)
如果您想将线程(或其他任何人)完成的所有这些更改应用到后端,那么我唯一想到的就是摆脱数据表。
这个列表课你已经被淘汰了。如果你将它实现为实现IList,你可以绑定它,就像它是一个DataTable
一旦你掌握了使用你的类而不是DataTable,你就可以看看BindingNotifications的时间和方式。
答案 1 :(得分:0)
UI未更新的第一个问题可能(可能)通过使用DataGridView
更新myDataGridView.Update()
来解决,这将仅刷新/更新此控件,并且比刷新整个表单更有效(我假设您正在使用WinForms)。
第二个问题的解决方案取决于您采用的线程类型(您未说明)。假设您正在使用TPL,可以使用TaskSheduler
将数据插入DataGridView
,因此您可以在单独的线程上运行的方法中使用
Task.Factory.StartNew(() =>
{
source1.DataSource = dtAll;
dataGridView1.DataSource = source1;
}, CancellationToken.None, TaskCreationOptions.None, _uiScheduler);
其中TaskScheduler
是从UI线程通过
TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
并传递给您异步方法。我希望这会有所帮助。