0

我有一个 DataTable 将包含大约几千行,每行大约有 20 个字段。

此外,单元格中的值将实时更改。此外,一些行将在运行时被删除,一些行将被添加。

我面临的第一个问题是,当我打开应用程序并调用 DataGrid.DataSource = .. DataGrid 最初不显示数据时,我必须最小化应用程序,然后将其重新打开以显示数据,为什么会这样?

第二个问题是每一行都会从一个单独的线程中更新。我不断收到“索引损坏”异常,然后我发现我无法从单独的线程更新数据表,因此我创建了一个包含所有单元格的类,创建了列表并让线程直接更新类数据,然后另一个单线程更新数据表,这似乎工作正常,但有没有更好的方法呢?

基本上我需要一个DataGrid,它支持几千行,这些行将被实时更新/删除/添加(通过线程,而不是用户)。实现这一目标的最佳方法是什么?

谢谢!

4

2 回答 2

0

摆脱数据表将是我的第一个想法,如果您想将线程(或其他任何人)完成的所有这些更改应用到后端,那么您真正需要它的唯一时间。

这个列表类你敲了。如果你得到它来实现 IList,你可以像它是一个 DataTable 一样绑定它

一旦你控制了使用你的类而不是 DataTable,你可以查看 BindingNotifications 的时间和方式。

于 2012-04-15T12:56:07.770 回答
0

UI 未更新的第一个问题可以(可能)通过更新DataGridViewusing来解决myDataGridView.Update(),这将仅刷新/更新此控件,并且比刷新整个表单更有效(我假设您正在使用 WinForms)。

第二个问题的解决方案取决于您采用哪种线程(您没有说明)。DataGridView假设您使用的是 TPL,则可以使用TaskSheduler您在单独线程上运行的方法中的 so将数据插入到

Task.Factory.StartNew(() =>
    {
        source1.DataSource = dtAll;
        dataGridView1.DataSource = source1;
    }, CancellationToken.None, TaskCreationOptions.None, _uiScheduler);

其中TaskScheduler是通过 UI 线程定义的

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

并传递给您的异步方法。我希望这有帮助。

于 2012-04-15T13:01:58.263 回答