异步绘制datagridview

时间:2015-04-02 14:07:06

标签: c# winforms datagridview

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

我在使用后台工作程序时没有这样的问题,但是因为它需要绘制datagrid&&在主线程上添加listview项目这种方法不起作用。

我在主线程上运行时运行正常,但我希望它能显示进度条而不会无响应。

我对异步编程和Control.Invoke()相当新。我该怎么处理?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我最终在每次迭代中使用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。