填充多级TreeView

时间:2015-08-02 09:30:57

标签: c# treeview multi-level

我尝试使用C#填充树视图。 我的数据是:

level   data  
1       xxxx  
2       yyyy  
3       aaaa  
2       rrrr  
1       oooo  

我想要像:

xxxxx  
_yyyy  
__aaaa  
_rrrrr  
ooooo  

我使用了这样的代码:

 for (int index = 0; index < dt.Rows.Count; index++)
 {
    TreeNode newNode = new TreeNode(dt.Rows[index]["Item"].ToString());
    treeView1.Nodes.Add(newNode);
    for (int j = index; j < dt.Rows.Count; j++)
    {
       TreeNode newNode1 = new TreeNode(dt.Rows[j]["Item"].ToString());
       newNode.Nodes.Add(newNode1);
       // treeView1.SelectedNode.Nodes.Add(newNode1);
    }
 }    

但结果很糟糕。我只能看到2个级别。

我知道我需要类似递归函数的东西,但我不知道如何通过树并返回到根。

2 个答案:

答案 0 :(得分:0)

你应该做那样的事情:

void TraverseTree(TreeNodeCollection nodes)
{
    foreach (var child in nodes)
    {
        DoSomethingWithNode(child);
        TraverseTree(child.Nodes);
    }
}

并将其命名为:

TraverseTree(MyTreeView.Nodes);

只需用您的逻辑

替换DoSomethingWithNode方法

答案 1 :(得分:0)

这是一个例子。

Tor测试它假设您拥有Textbox行中的级别和节点文本。

在测试按钮中单击我首先创建一个List<Tuple<int, string>>来保存关卡和文本。然后我添加一个根节点并填充树。当然,您可以跳过根节点并为AddNodes调用添加一些额外的逻辑..

private void testButton_Click(object sender, EventArgs e)
{
    treeView1.Nodes.Clear();
    treeView1.Nodes.Add("ROOT");
    List <string> lines = textBox1.Lines.ToList();
    List<Tuple<int, string>> nodes = filleNodesList(lines);

    AddNodes(treeView1, treeView1.Nodes[0], nodes);
}

AddNodes函数是递归的;它在处理后删除第一个条目,并在列表为空时停止。

如果您的等级跳起,则会将错误写入输出窗格..

void AddNodes(TreeView tv, TreeNode cNode, List<Tuple<int, string>> nList)
{
    TreeNode nNode = new TreeNode();
    int nLevel = cNode.Level;
    Tuple<int, string> t = nList[0];
    // sibling: add to our parent!
    if (t.Item1 == nLevel) { nNode = cNode.Parent.Nodes.Add(t.Item2); }
    // next generation: our own child!
    else if (t.Item1 == nLevel + 1) { nNode = cNode.Nodes.Add(t.Item2); }
    // below us: seek down the line of parents!
    else if (t.Item1 < nLevel) {
        while (t.Item1 < cNode.Level) cNode = cNode.Parent;
        nNode = cNode.Parent.Nodes.Add(t.Item2); }
    // more than 1 above: error!
    else { Console.WriteLine("Error: node levels must not jump up: " + 
                              nLevel + " --> " + t.Item1); }
    // done with this element
    nList.RemoveAt(0);
    // anything left to do?
    if (nList.Count > 0) AddNodes(treeView1, nNode, nList);
}

准备假定第一个字符串是有效的整数..:

List<Tuple<int, string>>  filleNodesList(List<string> lines)
{
    List<Tuple<int, string>>  nodes = new List<Tuple<int, string>>();
    foreach(string s in lines)
    {
       string[] sl = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
       Tuple<int, string> t = 
            new Tuple<int, string>(Convert.ToInt16(sl[0].Trim()), sl[1].Trim());
       nodes.Add(t);
    }
    return nodes;
}