2012-02-24 16 views
0

場景:複製C#中的整個DevExpress.XtraTreeList.TreeList#

我正在使用數據庫創建並填充一個Treelist。

這是一個相當耗時的任務,又不想掛GUI(也沒有任何「進度條」等)。

因此,我決定將所有這些移動到Backgroundworker,但由於我無法從另一個線程更新樹,那麼創建它的人將在後臺線程中創建一個臨時樹,並且完成後,整個內容到GUI顯示的樹。

  1. 什麼是遍歷和複製所有節點,節點數據等的最佳方式是什麼?
  2. 難道還有其他(更好?)的方式來做到這一點,即構建/創建一個BackgroundWorker一棵樹,並顯示在圖形用戶界面呢?

編輯:我知道在後臺線程中填充一個GUI組件的'黑客',但是因爲我剛剛被拋入這個項目並被要求「停止gui經常掛起」非常有限的時間框架,重寫加載和創建數據並不是真正的選擇(儘管這將是最佳實踐)。 我剛換了「CreateTree」 - 函數在一個新的線程中運行,通過新創建的樹「ThreadComplete」並複製。

乾杯

回答

1

UI元素,比如一個TreeView,應該留在事物的UI結束。這有技術上的原因 - Windows不允許更新來自任何線程,但主UI線程的UI元素 - 也是建築方面的原因:後端DB-訪問代碼不應該緊密耦合到任何特定的UI實現。如果您決定從的TreeList切換到不同的控制,由DevExpress的或任何其他供應商,你必須通過你的系統來代替代碼。

你想要做的是有你的後端代碼創建一個更一般的數據結構,如業務對象與分層結構的列表,像這樣:

public class MyBusinessObject 
{ 
    public string Name {get;set;} 
    public List<MyBusinessObject> ChildObjects {get;} 
} 

,並返回MyBusinessObject列表從你的後臺線程。這個列表應該使用數據綁定連接到你的TreeList。你沒有指定你使用的是什麼UI平臺 - XtraaTreeList是一個WinForms控件,對嗎? - 但是所有常見的框架都有數據綁定選項來將這個業務對象列表綁定到UI控件,而不是你自己做所有的工作。

0

爲了從另一個線程更新組件,您可以使用一個SynchronizationContext然後遍歷它喜歡它是在同一個線程。