【问题标题】:App window hangs while DataSource loads加载数据源时应用程序窗口挂起
【发布时间】:2014-07-23 17:54:22
【问题描述】:

我按下一个按钮(位于主窗体,MDI 父窗体上),它触发了 BackgroundWorker 的 RunWorkerAsync 方法(位于同一个 MDI 父窗体上)。在这种方法中,我设置了我的 DataGridView 的 DataSource,它位于我的主 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 的子窗口。我认为使用后台工作人员可以解决问题,但显然不能。

【问题讨论】:

  • 您的数据表包含多少行?
  • 刚刚做了另一个测试。目前悬挂的那根现在有 800 行,但它们非常密集(长串)。硬件不是 pb。

标签: c# .net datagridview datatable ado.net


【解决方案1】:

在 WinForm 上渲染一个巨大的表格是无可避免的。

无论是否异步,UI 仍然需要渲染整个网格。将其推送到后台线程只会使 UI 在计算和渲染时更具响应性。

另一种方法是对数据进行有意义的分页,以便您:

  1. 减少网络流量
  2. 减少 WinForm 的内存
  3. 加快渲染时间

用户是否需要一次点击 1,000 或 100,000 行数据?人类无法计算这种规模的信息 - 因此报告汇总了这些值。

看看这个 StackOverflow 帖子 relating to paging a DataGridView 看看是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多