现有许多string类型的数据,都是表示目录的,比如:
"/.3/fedora-epel"
"/.3/fedora-epel/beta"
"/.3/fedora-epel/5"
"/.3/fedora-epel/5/SRPMS"
"/etc"
"/.3"
"/open/CAS"
"/open/Aircrack-ng"  
... ...现在要做的是根据这些string数据,动态添加完成一个TreeView,以直观的方式显示该目录的层次结构。
TreeView控件这方面没问题,关键是如何提取这些string的内容,并判定父子节点的关系?新手求思路。

解决方案 »

  1.   

    建立这个树 datatable
    分析这些字符串,保存到datatable中
    字符串很好分析吧
      

  2.   


    比如 /.3/fedora-epel/5/SRPMS 按照/分割后得到char数组: .3 fedora-epel 5 SRPMS,接下来就不太明白了,如何动态建立treeview?根节点建立后怎么将上面几个元素建立为子节点?
      

  3.   

    那些一两个字的估计都不知道自己说啥,楼主不用理会。先从最简单效率最低的做起:
    一个字符串按照“/”拆分,从头往后,第一个子字符串是树节点第一层,那么在树节点Nodes里面找(ContainsKey)有没有,有的话找到节点继续往下,没有的话插入节点往下;然后第二层,在前面那个节点下面去找有没有存在的节点,有的话找到节点继续往下,没有的话插入节点再往下……不重复了,字多也没钱。
    然后下一个字符串,从根节点重新开始找……对了插入和查找的时候可以用键,效率高一些。
      

  4.   

    分割后得到char数组?分割后不是字符串数组吗
      

  5.   


    再请教一下前辈,我自己捣鼓了一下,代码如下:
    TreeNode tn = new TreeNode();    //先建好根节点
    tn.Text = "根节点";
    treeView1.Nodes.Add(tn);  string[] s = new string[] {"aaa","bbb","ccc","ddd","eee" };
    TreeNode tns = treeView1.Nodes[0];    //第一轮建立子节点
    foreach (var item in s)
    {
          tns.Nodes.Add(item);
          tns = tns.Nodes[0];
    }
    //第二轮建立子节点,(又有一组数据)这次就需要判断是否有重复的节点,若有则跳过不建立,否则建立。
    string[] s2 = new string[] {"aaa","222","ccc","333","eee" };
    TreeNode tns2 = treeView1.Nodes[0];
    foreach (var item2 in s2)
         {
             if (tns2.Nodes[0].Text.CompareTo(item2)!=0)
             {
                 tns2.Nodes.Add(item2);
             }
             tns2 = tns2.Nodes[0];
         }以上代码可以实现建立功能,但现在有很多这样的数据,它们都是实时捕捉的:
     "/.3/fedora-epel"
     "/.3/fedora-epel/beta"
     "/.3/fedora-epel/5"
     "/.3/fedora-epel/5/SRPMS"
     "/etc"
     "/.3"
     "/open/CAS"
     "/open/Aircrack-ng" 
     ... ... 
    拆分可以实现,用
    sub_dir = string_dir.Split(new char[] { '/' }); 
    得到若干目录名,然后依照上面的方法建立子节点。上面就建立了2轮,写了2个foreach,但是后面还有好多好多轮...... 如何将第一轮、第二轮以及后面的几轮写到一个循环里呢?谢谢!
     
      

  6.   


    private void addeNodes(String[] s2,TreeNode tns)
    {
    foreach (var item2 in s2)
         {
             if (tns.Nodes[0].Text.CompareTo(item2)!=0)
             {
                 tns.Nodes.Add(item2);
             }
             tns= tns.Nodes[0];
         }
    }
      

  7.   


    前辈遇到一个问题:
    if(count != 0)
        {
           for (int j = 0; j < count; j++)
             {
                  (tns.Nodes[j].Text.CompareTo(item)) != 0;
             }
        }这段代码我原本想实现:count表示该节点的下一级节点数,然后用tns.Nodes[j].Text.CompareTo(item) != 0 这个语句来实现遍历tns节点的所有下一级节点用于与item比较,但是却提示我tns.Nodes[j].Text.CompareTo(item)) != 0这句不能作为语句?有红色的下划线,那么如何遍历某一节点的所有下一级节点呢?(不是所有子节点,只是所有下一级的节点)
      

  8.   


    谢谢回复,请教一下,这里tns.Nodes[0].Text.CompareTo(item2)!=0只能判断tns的第一个子节点是否与item2相等,请问如何遍历tns节点的所有下一级节点呢?(不是所有子节点,只是所有下一级的节点)
      

  9.   

    有nodes属性。再去查一遍就可以了。。是一样的。
      

  10.   


    public void InsertTree(string[] s)
            {
                int jj = 0, ii = 0;
                TreeNode tns = treeView1.Nodes[0];
                foreach (var item in s)
                {
                    if (item != "")
                    {
                        int count = tns.Nodes.Count;
                        int flag = 0;
                        if (count == 0)
                        {
                            tns.Nodes.Add(item);
                            tns = tns.Nodes[0];
                        }
                        else
                        {
                            for (int j = 0; j < count; j++)
                            {
                                if ((tns.Nodes[j].Text.CompareTo(item)) != 0)
                                {
                                    flag = 1; //不存在该节点
                                    ii = j;
                                }
                                else
                                {
                                    flag = 0;
                                    jj = j;
                                    break;
                                } 
                            }
                            if (flag == 1)
                            {
                                tns.Nodes.Add(item);
                                tns = tns.Nodes[ii + 1];
                            }
                            else
                            {
                                tns = tns.Nodes[jj];
                            }
                        }  
                    }
                }
            }
    我是初学者,代码效率估计很低,但是可实现功能。