如何根据一个文本文件内容来产生TreeView控件的内容?文本文件内容如下:
abc {
   111 {
       aaa ;
       bbb ;
       ccc ;
        }
    }
在这里当然我每行字符串的内容已经省略,可能存在多个{}嵌套.
如上面最简单的嵌套生成的Tree也应该是abc是根结点,111是其下的一个分支,111下又有3个子结点.
请有这方面经验的大虾能给出一个好的解决方案谢谢!

解决方案 »

  1.   

    现在有人建议我:设一个DataTable,列里包含所需要的字段,TreeView和DataTable绑定。读取文件后将每一条记录变为一个DataRow加到这个DataTable里,那么DataTable就有了文件的所有信息,请问大虾们这种方法可行吗 ?我现在在想如果要做递归判断执行到哪个{}里了应该如何做比较好.这个文件很大我就算不做判断把它用文本框输出好象都要运行很久,请大家帮忙找到一个效率比较高的方法.谢谢
    另外to:copico(一路向北) 你说说的词法分析是指什么?(不要怪我问的问题太简单)
    to:FlashElf(銘龘鶽) 可以调用系统函数具体是什么系统函数?要怎么做呢?
    谢谢2位
      

  2.   

    我现在对于如何判断{}中内容属于哪一个结点的方法有疑问,不知道如何判断了.
    我现在的做法是:
    设了三个变量int nowparent=0
       int countid=1;
       int level=0;
    当遇到{时:
    把此行内容加入临时表
    然后level=level+1;
        nowparent=countid;
    当遇到}时:
       level=level-1;
       nowparent=level;
    这样肯定是有问题的因为如果遇到如下情况:
    AAA {
    BBB {
    kkk=kkk
    www {
    111=111
    222=222
    333=333
    }
    444=444
    }
    CCC {
    ddd=ddd
    DDD {
    111=111
    222=222
    333=333
    }
    aaa=aaa
    bbb=bbb
    ccc=ccc
    }
    }
    循环到D{结束即到}时,}的父结点level这时和前面的www{}level一样了,于是包括}和下面的
                      aaa=aaa
    bbb=bbb
    ccc=ccc
    都会处理到和www{}同级
    请大家帮我想想这个算法正确的应该是怎样的?
      

  3.   

    我做过一个根据数据库内容生成树的程序。大致过程如下。在数据库建表。一列是名称mc,一列是类别内码 lbnm。名称就是你的树的节点名,类别内码用来区分节点层次。 如一级节点的类别内码就是a,b,c,d等,要是你有26个一级节点可以一直到z。2级节点的类别内码,就是在一级节点的基础上增加一位。aa代表a的子节点,ab代表a的第二个字节点,如此类推,一棵树就出来了。代码就补贴出来了,挺简单的。
      

  4.   

    如果根据文本的内容生成的树没有问题我也能正确生成一个Tree.
    现在就是在根据上面文本得到临时表的时候出现了问题:问题说的简单一点就是假如数据表有三个字段Id,Content,ParentId怎样确定ParentId的值往数据表中填充?
    文件内容格式就是我上面给的那样
      

  5.   

    帮人帮到底:一下代码调试通过,结果正确。
    string[] mysSrinh=new string[22];
    mysSrinh[0]="AAA{";
    mysSrinh[1]="BBB{";
    mysSrinh[2]="kkk=kkk";
    mysSrinh[3]="www{";
    mysSrinh[4]="111=111";
    mysSrinh[5]="222=222";
    mysSrinh[6]="333=333";
    mysSrinh[7]="}";
    mysSrinh[8]="444=444";
    mysSrinh[9]="}";
    mysSrinh[10]="CCC{";
    mysSrinh[11]="ddd=ddd";
    mysSrinh[12]="DDD{";
    mysSrinh[13]="111=111";
    mysSrinh[14]="222=222";
    mysSrinh[15]="333=333";
    mysSrinh[16]="}";
    mysSrinh[17]="aaa=aaa";
    mysSrinh[18]="bbb=bbb";
    mysSrinh[19]="ccc=ccc";
    mysSrinh[20]="}";
    mysSrinh[21]="}";
    //实际运行时你可以把文本文档中读出的数据变成字符串数组,每行对应数组中的一项。
    TreeNode currentNode=new TreeNode();
    Stack s=new Stack();
    int level=0;
    string nodeText;
    for(int i=0;i<mysSrinh.Length;i++)
    {
    if(level==0)
    {   
    nodeText=mysSrinh[i];
    treeView1.Nodes.Add(nodeText.Trim('{'));
    if(mysSrinh[i].EndsWith("{"))
    {
    level++;
    currentNode=treeView1.Nodes[treeView1.Nodes.Count-1];
    }
    }
    else
    {   
    if(mysSrinh[i].EndsWith("{"))
    {
    if(level==0)
    {   
    currentNode=treeView1.Nodes[treeView1.Nodes.Count-1];
    currentNode.Nodes.Add(mysSrinh[i].Trim('{'));
    }
    else
    {   
    s.Push(currentNode);
    currentNode.Nodes.Add(mysSrinh[i].Trim('{'));
    currentNode=currentNode.Nodes[currentNode.Nodes.Count-1];
                               
    }
    level++;
    }
    else if(mysSrinh[i].StartsWith("}"))
    {
    if(level==1)
    {
    level--;

    }
    else
    {
    currentNode=(TreeNode)s.Pop();
    level--;
    }
    }
    else 
    {
    currentNode.Nodes.Add(mysSrinh[i]);
    }

    }
    }
      

  6.   

    谢谢大家,特别感谢大竹子.
    我已经使用堆栈成功找到其父亲街结点位置并且能够记录
    虽然后面还需要对树的结点进行增、删、改.但是从文件读取到树已经没有问题了.
    希望以后大家还要多多帮助我这个初学者
    PS:nnppc说的正则我还不会用,如果有机会还请不吝赐教
    现在我就结帖了,再次谢谢大家关注本帖!