2015-04-02 71 views
0

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

我没有这样的问题,当使用后台工作,但由于其必要绘制数据网格& &在主线程添加列表视图项目,这种方法将无法正常工作。

我确定它在主线程上运行,但我希望它显示进度条,而不会变得没有响应。

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

+0

你不能将验证和加载分离到datagridview过程吗?这样验证可以在后台线程中完成。你也可以在后台加载所有数据到你的数据集,然后让datagridview在完成所有工作时加载数据 – 2015-04-02 14:13:43

+0

这将是我的方法,但它的浪费 - 迭代excel文件,制作出错列的列表,然后再次迭代添加listviewitems并绘制网格。 – Luntri 2015-04-02 14:34:03

回答

0

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

您必须在VirtualMode中使用您的DataGridView。在这种模式下,只有可见的单元格被绘制,因此您可以在DataGridView中获得大量数据。

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。