簡體   English   中英

C#/ LINQ / Objects / Lists:如何填充TreeView的好方法?

[英]C#/LINQ/Objects/Lists: How to populate a TreeView the good way?

我正在嘗試在TreeView中顯示一堆信息。 例如:

Continent 1
    Country 1
        City 1
        City 2
        City 3
    Country 2
        City 1
        City 2
    Country 3
Continent 2
    Country 1
        City 1
        City 2
Continent 3

該信息通過列表存儲在類/對象中。 因此,Continent類型的對象/類包括一個列表,其中包含一些Country類型的對象/類(當然還有一些方法,屬性等)。 所有數據都是通過LINQ從XML文件中填充的。

現在,我可以列出所有大陸在內的清單,並進行列舉。 在此foreach中,我將所有國家/地區的清單都列出。 然后我進行foreach ...簡單的方法,但是我認為這會產生非常討厭的代碼(我的節點深度超過了3個級別...)

那么有沒有簡單的方法可以做到這一點? 也許使用LINQ? 例如

TreeView.Nodes =
    List[Countries].All.Where(Country.Name = Node.Text).Add(
        (List[Cities].All.Where(City.Name = Node.Text).Add(
            List[People].All.Where(Person.Name = Note.Text)));

我知道,只是垃圾代碼,但是這樣一來,它看起來比所有嵌套的foreach都更漂亮。

希望您能提供幫助。

在XAML中,您可以使用HierarhicaDataTemplate

您可以嘗試遞歸。

首先定義一個遞歸數據結構來存儲您的節點信息。

public interface IRecursiveStructure
{
   string Name {get;}
   IList<IRecursiveStructure> Children {get;}
}

實施接口並進行相應填充。

然后,要加載樹節點,請使用遞歸方法(這是未經測試的偽代碼)。

public void LoadTreeNodes(IRecursiveStructure data, TreeNode parentNode)
{
   foreach(var child in data.Children)
   {
        node = new Node{Name=data.Name};
        parentNode.Add(node).
        LoadTreeNodes(node,child);
   }

}

這只是一個偽代碼示例,因此您需要對其進行一些處理才能使其工作。

有關遞歸概念的更多信息,請參見http://en.wikipedia.org/wiki/Recursion

暫無
暫無

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

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