2010-02-25 41 views
-1

在我的應用程序中,我更新了backgrounworker線程中的一個treeview。在更新樹視圖時,組合框值不可見。當樹視圖更新時,會顯示值。C#組合值在線程準備就緒後可見

這裏是我的BackgroundWorker代碼:

void _bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    tvCategories.Invoke((MethodInvoker)delegate() 
    { 
     FillCategoryTreeView(); // Fills the treeview 
    } 
    ); 
} 

,填補我的組合框代碼:

private void FillCategoryCombo() 
{ 
    Category categorie = new Category(); 
    List<Category> categories = categorie.GetQuestionCategories(); 

    cmbCategories.DataSource = categories; 
    cmbCategories.DisplayMember = "Description"; 
    cmbCategories.ValueMember = "Id"; 
} 

組合框填充在窗體的構造函數。

我把樹視圖放在一個單獨的線程中的原因是因爲樹視圖必須更新。在此期間,我想繼續使用該應用程序。因此我需要訪問組合框。但是樹形視圖正在更新時,組合框的值不可見。

該怎麼做才能解決這個問題?

+1

什麼問題?你只告訴我們你做了什麼,有什麼問題,但現在什麼... 如果你只調用一個UI調用,使用backgroundWorker有什麼意義? – Peter 2010-02-25 14:23:20

回答

1

我不太確定您的文章中是否有足夠的信息來完全回答問題......但假設您在調用FillCategoryCombo()方法之前在構造函數中創建了後臺工作線程......這使得感。

在您的後臺工作方法中,您立即調用Invoke,它將控制切換回UI線程,然後在FillCategoryCombo()有機會運行之前,該線程將執行FillCategoryTreeView()的工作。

如果您想異步填充您的樹視圖(假設它來自長時間運行的數據庫調用),那麼當您需要添加樹視圖項目時,您需要做的實際上是在FillCategoryTreeView中單獨調用調用。這樣,每次數據庫調用(或者需要很長時間)完成時,只需要在UI線程上添加物理樹節點時執行操作。