【问题标题】:Populate a multilevel TreeView填充多级 TreeView
【发布时间】:2015-08-02 09:30:57
【问题描述】:

我尝试使用 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 个级别。

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

【问题讨论】:

    标签: c# treeview multi-level


    【解决方案1】:

    你应该这样做:

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

    然后调用它:

    TraverseTree(MyTreeView.Nodes);
    

    只需用您的逻辑替换 DoSomethingWithNode 方法

    【讨论】:

      【解决方案2】:

      这是一个例子。

      Tor 测试假定您在Textbox 的行中具有关卡和节点文本。

      在测试按钮中单击我首先创建一个List&lt;Tuple&lt;int, string&gt;&gt; 来保存关卡和文本。然后我添加一个根节点并填充树。当然你可以跳过根节点,在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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 2017-06-05
        • 2010-10-22
        • 2017-04-18
        相关资源
        最近更新 更多