2014-02-19 91 views
3

我目前有一個項目列表(元組)已經以編程方式生成過,我現在試圖遞歸地傳遞給TreeView,但我正在努力使它正常工作。C#從列表中遞歸創建TreeView

列表示例:名稱|等級

Fruits | 0 
Apples | 1 
Green Apples | 2 
Golden Delicious | 3 
Granny Smith | 3 
Cox Orange Pipper | 2 
Red Apples | 2 
Pink Lady | 3 
Red Delicious | 3 
Oranges | 1 
Blood | 2 
Mandarins | 2 
Vegetables | 0 
Lettuce | 1 
Iceberg | 2 
Romain | 2 

所以我想輸出爲:

Fruits (0) 
- Apples (1) 
-- Green Apples (2) 
--- Granny Smith (3) 
--- Golden Delicious (3) 
-- Cox Orange Pipper(2) 
-- Red Apples (2) 
--- Pink Lady (3) 
--- Red Delicious (3) 
- Oranges (1) 
-- Blood (2) 
-- Mandarins (2) 
Vegetables (0) 
- Lettuce (1) 
-- Iceberg (2) 
-- Romain (2) 

注:請參閱從LarsTech回答下面一個完全正常工作的解決方案。謝謝!

我已經刪除了erroneus代碼/企圖,我會在這裏爲其他具有相同問題的人留下。

+0

究竟是什麼「LastNode」在這裏?那是父節點嗎?另外'roots.Add(tree.Nodes.Add(「Items」))''做了什麼?添加是否返回一個新的TreeNode? – arviman

+0

你可以發佈你的'TreeItem'' TreeNode'和'TreeView'類的結構嗎? – arviman

+0

清理了一下帖子。 LarsTech提供的答案非常完美。 – user3295596

回答

0

每個節點的「級別」的值是你的父母唯一的參考,所以你可以保持水平的字典引用用於該級別的最後一個節點:

Dictionary<int, TreeNode> lastParent = new Dictionary<int, TreeNode>(); 
foreach (Tuple<string, int> food in foods) { 
    TreeNodeCollection items; 
    if (food.Item2 == 0) { 
    items = treeView1.Nodes; 
    } else { 
    items = lastParent[food.Item2 - 1].Nodes; 
    } 
    TreeNode treeNode = items.Add(food.Item1); 
    if (lastParent.ContainsKey(food.Item2)) { 
    lastParent[food.Item2] = treeNode; 
    } else { 
    lastParent.Add(food.Item2, treeNode); 
    } 
} 
treeView1.ExpandAll(); 
+0

非常感謝,這絕對完美,輕鬆解決問題,我非常感激。 – user3295596