2012-10-31 15 views
0

我想在TreeView中顯示一堆信息。例如:C#/ LINQ/Objects/Lists:如何填充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))); 

我知道,只是垃圾代碼,但這樣它看起來方式比與所有這些嵌套foreachs更加美麗。

我希望你能幫上忙。

+0

如何遞歸數據結構來存儲您的信息和遞歸方法來設置樹? – gls123

+0

@GavinSinai你是什麼意思'遞歸'?我認爲如果內部有任何列表,像掃描目錄以獲得更多目錄/級別,就不可能'全局'對象。請舉個例子吧? – user1450661

回答

1

在XAML可以使用HierarhicaDataTemplate

+0

哇。那個看起來很有趣。但是我沒有看到我可以如何將它應用於我現有的數據,而不需要自己循環每個級別(對象)(這將導致使用foreach的基本方法)。也許是一個例子? – user1450661

+0

示例在文章中。在分層模板中,您將ItemSource設置爲下一個級別(因此是hierahical),如果需要,它可以是相同的類型。 – m0sa

0

你可以嘗試遞歸。

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

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

+0

在這裏,我看到了我的對象多種多樣的問題。 其中一些內部有2個列表,其中一些沒有指示「名稱」的字符串(有時是一個整數,另一次我需要在某些情況下首先從文件加載名稱等) 接口意味着對象必須遵循某個在任何時候都沒有給出的結構。 – user1450661

+0

您需要實現每個類的接口。每個班級將有不同的實施。不知道你還能如何「優雅地」解決這個問題。 – gls123

+0

好的。收到。它比單純的foreach更加優雅..當一個對象有2個列表時,情況如何?在上面的foreach中,它只是遍歷列表Children,意味着每個對象只有一個列表。 – user1450661