【问题标题】:Asynchronously paint datagridview异步绘制datagridview
【发布时间】:2015-04-02 14:07:05
【问题描述】:

我需要在主线程上绘制一个 datagridview。我正在处理的数据来自通常包含数千条记录的大型 Excel 文件。 当我验证(检查错误并绘制)时,它会阻塞主 UI,显示“应用程序没有响应”并且在完成之前不会刷新进度条。

我在使用后台工作者时没有这样的问题,但由于需要在主线程上绘制数据网格 && 添加列表视图项,这种方法将不起作用。

我可以在主线程上运行它,但我希望它显示进度条并且不会变得无响应。

我对异步编程和 Control.Invoke() 还很陌生。我该如何处理?

【问题讨论】:

  • 您不能将验证和加载拆分到 datagridview 进程中吗?这样验证可以在后台线程中完成。您还可以在后台将所有内容加载到您的数据集中,然后在一切完成后让 datagridview 加载该数据
  • 这将是我的方法,但它很浪费 - 迭代 excel 文件,列出有错误的行,然后再次迭代以添加 listviewitems 并绘制网格。

标签: c# winforms datagridview


【解决方案1】:

Control.Invoke() 在主线程中执行代码(正是你不想要的)。

您必须在VirtualMode 中使用您的DataGridView。在此模式下,仅绘制可见单元格,因此您可以在 DataGridView 中拥有大量数据。

【讨论】:

    【解决方案2】:

    我最终在每次迭代中使用 Application.DoEvents(),必要时调用绘画,将 Form.DoubleBuffered 设置为 true 并使用:

      [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
        private const int WM_SETREDRAW = 11; 
    

    停止/开始绘制 datagridview 并最终在最后调用 refresh(),有效地为我节省了 80% 的验证过程时间。

    我强烈推荐使用 backgroundWorker。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多