簡體   English   中英

在C#中復制整個DevExpress.XtraTreeList.TreeList

[英]Copy an entire DevExpress.XtraTreeList.TreeList in C#

場景:

我正在使用數據庫創建和填充樹形列表。

這是一項非常耗時的任務,並且不想掛起gui(也沒有任何“ progress-bar”等)。

因此,我決定將所有內容移至Backgroundworker,但是由於無法從另一個線程更新樹,因此創建樹的人正在后台線程中創建一個臨時樹,完成后,只需將所有內容復制到該線程即可。 GUI顯示的樹。

  1. 遍歷和復制所有節點,節點數據等的最佳方法是什么?
  2. 還有另一種(更好的方法)做到這一點,即在Backgroundworker中建立/創建樹並將其顯示在GUI中嗎?

編輯:我知道在后台線程中填充GUI組件的“ hack”,但是由於我剛被投入該項目並要求在非常有限的時間范圍內“停止gui經常掛起”,因此編寫數據的加載和創建並不是一個真正的選擇(即使這可能是最佳實踐)。 我只是將“ CreateTree”功能更改為在新線程中運行,將新創建的樹傳遞給“ ThreadComplete”並復制它。

干杯

UI元素(如TreeView)應留在UI的末端。 出於技術原因,Windows不允許從任何線程中更新UI元素,而是從主UI線程中進行更新。但是,出於架構原因:后端DB訪問代碼不應與任何特定的UI實現緊密結合。 如果決定通過DevExpress或任何其他供應商從TreeList切換到其他控件,則必須在整個系統中替換代碼。

您想要做的是讓您的后端代碼創建一個更通用的數據結構,例如具有分層結構的業務對象列表,如下所示:

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

並從后台線程返回MyBusinessObject的列表。 該列表應使用數據綁定連接到TreeList。 您沒有指定要使用的UI平台-XtraaTreeList是WinForms控件,對嗎? -但是所有常見的框架都有數據綁定選項,可以將此業務對象列表綁定到UI控件,而不是讓您自己完成所有工作。

為了從另一個線程更新Component,您可以使用SynchronizationContext ,然后像在同一線程中一樣遍歷它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM