2012-12-17 64 views
1

我有一個窗體,「StartForm」,其中用戶使組合框選擇,然後單擊一個按鈕。從那裏,我想:在後臺線程上格式化winforms UI

  1. 生成另一種形式,「MainForm的」

  2. 的實例,通過每一行有大約50 000行

  3. 環填寫該表格上的DataGridView datagrid視圖並對其執行一些處理。就我而言,它是根據單元格的值來格式化行顏色,並更新一些列。

  4. 顯示錶格。

這是直截了當的,但是由於大量的行和每個處理時間,UI在構建MainForm時會凍結。所以我需要在後臺線程上構建MainForm,並在進行時填充StartForm的進度條。

我不斷收到跨線程異常,或者在使用backgroundWorker時,我的格式會丟失,而control.Invoke()也似乎會引發異常。也許我只是沒有正確使用這些...

有人可以請解釋如何完成上述?我試圖讓問題基本理解,以便對其他人有所幫助,但是如果您想要我的代碼,請詢問。

謝謝!

回答

2

我認爲你需要爲你的數據網格實現虛擬模式。看看關於implementing Virtual Mode in the DataGridView Control的msdn文章。小樣本:

grid.VirtualMode = true; // enable virtual mode 
grid.RowCount = source.Count; // 50000 
grid.CellValueNeeded += grid_CellValueNeeded; 
grid.CellPainting += grid_CellPainting; 

使用CellValueNeeded事件處理程序,以提供單元格的值(即,從源極選擇值)。使用CellPainting事件處理程序根據單元格值設置單元格顏色(使用e.CellStyle屬性)。如果要用數據填充源代碼需要很長時間,則可以在BackgroundWorker中執行此操作。但是,在虛擬模式下進行格式化和顯示數據 - 這是最好的選擇,當你有大量的行(順便說一下,應用一些過濾 - 很少用戶需要一次50000行數據)。

+1

不是我期待的,但肯定是我的解決方案。謝謝!!! – Kurren

0

默認情況下,所有的工作都是在UI線程上完成的,因爲在繁重的工作中UI變得無法訪問,所以這給出了'崩潰'的錯覺。在不是UI線程的線程上創建表單本身是可能的,但意味着表單只能由創建它的線程訪問,所以它不太可能是您想要的。你會得到cross-thread exception,因爲你試圖從另一個線程修改UI線程。

你可以嘗試的是加載和處理後臺線程上的所有數據,但將其加載到新的臨時文件DataTable中。然後,在UI線程上使用DataSet.Merge(如果使用的是BackgroundWorker,則可能在RunWorkerCompleted事件中),並將臨時DataTable與綁定到DataGridView的主DataSet合併。

這應該意味着所有的處理和繁重的工作是在後臺線程完成,但DataGridView控制更新UI線程上,從而繞過任何無效的跨線程。一方面說明你應該測試DataSet.Merge的性能。

+0

我喜歡這個主意,我會仔細研究一下,謝謝。但是處理和格式化在DataGridView本身上完成(即更改特定行的backgroundColor)。 – Kurren

+0

關於顏色格式方面,這裏的答案可能有助於http://stackoverflow.com/questions/1630066/c-sharp-winforms-datagridview-background-color-rendering-too-slow – keyboardP

相關問題