2014-02-19 64 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