2009-09-16 68 views
1

我讀過一些關於使用BackgroundWorker對象來處理執行時間密集型任務的示例,這些任務會生成用於填充DataGridView的結果。但在我的情況下,似乎填充DataGridView的行爲是花費最多的時間。我想知道是否這是因爲我需要格式化結果(隱藏某些列,檢查每行的某些標誌以設置顏色/字體等)。多線程datagridview行的格式?

例子:

DataTable results_table; 
DataGridView my_grid; 
DataView my_view; 

private void fillTable() 
{ 
    // Generate the results 
    ... 


    // Bind the data. 
    my_view.Table = results_table; 
    my_grid.DataSource = my_view 


    // Format the results 
    my_grid.Columns[0].Visible = false; 
    my_grid.Columns[1].Visible = false; 

    my_grid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
    my_grid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 

    foreach (DataGridViewRow row in my_grid.Rows) 
    { 
     // Check for flags and format necessary rows. 
    } 
} 

這是去這樣做的正確的方式,或者是有一些其他的方式來格式化結果而不必通過每一行迭代?

回答

5

你實際上不可能在另一個線程中格式化,因爲處理UI元素的所有操作必須發生在UI線程上。您可以做的最好的事情就是先做好處理和決策,以便實際與GUI交互的代碼儘可能簡單和精簡。

+0

正如Fredrik指出的那樣,使用「AutoSizeMode」屬性(特別是當它被設置爲「AllCells」時)導致了最大的延遲。所有列現在都設置爲「填充」,即使採用逐行格式(加粗,下劃線等),性能降低也不那麼重要。 – themarshal 2009-12-16 20:28:51

1

我不認爲多線程技術可以幫助你在這裏,因爲任何與控件的交互都需要在GUI線程上進行(正如亞當指出的那樣)。

上次我使用DataGridView我發現我最大的性能瓶頸是使用AutoSizeMode。不記得它是否是一些特別的值,但是它確實有點不同。我會試着用這個屬性來開始。

0

我不記得.NET是否有一個選項可以暫停屏幕更新,同時進行一系列更改以形成控件。如果確實如此,那可能會加速您的UI更改。

0

正如大家所提到的,您只能從GUI線程更新您的用戶界面。但是,你可以做的是將代碼創建在一個單獨的線程上創建my_view