DataGridView + DataTable,处理大型列表的最佳方式

本文关键字:列表 最佳 方式 大型 处理 DataTable DataGridView | 更新日期: 2023-09-27 18:31:14

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

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

我面临的第一个问题是,当我打开应用程序并调用 DataGrid.DataSource = ..DataGrid 一开始不显示数据,我必须最小化应用程序,然后将其重新打开才能显示数据,为什么会发生这种情况?

第二个问题是每一行都将从单独的线程更新。我一直收到"索引损坏"异常,然后我发现我无法从单独的线程更新 dataTable,因此我创建了一个包含所有单元格的类,创建了 List 并使线程直接更新类数据,然后另一个线程更新 dataTable,这似乎工作正常,但是有没有更好的方法可以做到这一点?

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

谢谢!

DataGridView + DataTable,处理大型列表的最佳方式

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

这个列表类你已经敲了。如果你让它实现 IList,你可以像绑定到一个数据表一样绑定到它

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

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

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

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

其中TaskScheduler是从 UI 线程通过以下方式定义的

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

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