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

时间:2012-04-15 12:33:51

标签: c# datagridview datatable

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

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

第一个问题我面临的是,当我打开应用程序并调用DataGrid.DataSource = .. DataGrid最初没有显示数据,我必须最小化应用程序和然后把它重新打开以显示数据,为什么会发生这种情况?

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

基本上我需要一个DataGrid,它支持几千行,这些行将被直接更新/删除/添加(通过线程,而不是用户)。完成此任务的最佳方法是什么?

谢谢!

2 个答案:

答案 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();

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