2015-04-02 39 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。