繁体   English   中英

DataGridView + DataTable,处理巨大列表的最佳方法?

[英]DataGridView + DataTable, best way of handling huge lists?

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

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

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

第二个问题是每行将从单独的线程更新。 我不断收到“索引损坏”异常,然后发现无法从单独的线程更新dataTable,因此我创建了一个具有所有单元格的类,创建了List,并使线程直接更新了类数据,然后另一个线程更新了dataTable看起来不错,但是有更好的方法吗?

基本上,我需要一个DataGrid,它支持数千行(将由线程而不是用户实时更新/删除/添加)。 做到这一点的最佳方法是什么?

谢谢!

摆脱数据表是我的第一个想法,这是您真正需要的唯一时间,如果您想将所有线程(或其他任何事情)所做的所有更改应用于后端。

您已取消此清单课程。 如果将其实现到Implement IList,则可以将其绑定为DataTable

一旦像使用您的类而不是使用DataTable一样进行控制,就可以查看BindingNotifications的时间和方式。

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

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

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

通过UI线程从以下位置定义TaskScheduler位置

TaskScheduler _uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM