数据源加载时,应用程序窗口挂起
本文关键字:窗口 挂起 应用程序 加载 数据源 | 更新日期: 2023-09-27 18:06:30
我按下一个按钮(位于主窗体,MDI父窗体上),它触发BackgroundWorker的RunWorkerAsync方法(位于相同的MDI父窗体上)。在这个方法中,我设置了我的DataGridView的数据源,它位于我的主Mdi窗口拥有的一个子窗口内。下面是RunWorkerAsync的代码:
Action d = () => {
((DataGridView) data_viewer.gridviewer).SuspendLayout();
((DataGridView) data_viewer.gridviewer).DataSource = datatable_copied;
((DataGridView) data_viewer.gridviewer).ResumeLayout();
};
base.Invoke( d );
上面的代码填充网格OK。所有数据都传送到网格中。问题是,我将与非常大的表工作,而数据加载整个应用程序挂起,包括Mdi父窗口。我不介意有DGV挂起,但对于主MDI父窗口和包含DGV的子窗口挂起,而这整个事情加载太多了。我怎么解决这个问题?我希望能够移动包含DGV的子窗口而没有问题,而它加载(或可能绘制)整个数据表。我以为使用后台工作人员可以解决这个问题,但显然它没有。
在WinForm上渲染一个巨大的表是无法避免的。
无论是否异步,UI仍然需要渲染整个网格。将它推到后台线程只会使UI在计算和渲染时响应更快。
另一种方法是有意义地分页数据,以便:
- 减少网络流量
- 减少WinForm的内存
- 加快渲染时间
用户在一次点击中需要1000行还是100,000行数据?人类无法计算出如此规模的信息,因此报告汇总了这些值。
看看这篇关于对DataGridView分页的StackOverflow帖子,看看是否有帮助。