我做了一个小系统,用到了TreeNode。我是这样想的,在前台图形里面关联TreeNode,然后通过连接,把TreeNode添加到TreeView里,形成一个树结构。在TreeNode的tag里面,是一个自定义Button,这个Button里面有个GenerateCode虚方法。所有的Button继承自我写的一个公共基类。这样,我只要通过遍历树,顺次调用Button的Generate方法,就能生成一系列代码。但是我在把TreeNode添加到TreeView的过程中,总是有问题。现在没法动态建立树枝,只能一条线到底,变成了一个链表。现在我很困惑,这个问题搞不定了。如果有能搞定的朋友希望可以帮帮忙。我的QQ283489754,MSN:[email protected]如果搞定的话,分不是问题,先谢谢大家

解决方案 »

  1.   

    貌似应该不会变成链表的,是不是你的前台图形里添加TreeNode的时候,点击一下只能添加一个下级TreeNode,你要考虑添加多个并行的下级TreeNode的情况。
      

  2.   

    我的类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;using System.Web;namespace Robot
    {
        //CodeTree类:
        //说明    :CodeTree类主要是用于操作代码树,它的内容包括:
        //          创建代码树
        //          在代码树中添加结点
        //          从代码树中删除结点
        //          遍历代码树
        //          从代码树中寻找结点    class CodeTree
        {
            public CodeTree()
            {
                tv = new TreeView();            NewTreeNode = new TreeNode[1000];
           
                root = new TreeNode("root");            tv.Nodes.Add(root);            current = new TreeNode("current");
            }        //在树中的current结点下添加一个结点
            public TreeNode AddNode(CybotButton cb)
            {
                //新建一个数组
                try
                {
                    ++i;
                    NewTreeNode[i] = new TreeNode(i.ToString());
                    NewTreeNode[i].Text = i.ToString();
                    NewTreeNode[i].Tag = cb;
                    
                    
                    this.current.Nodes.Add(NewTreeNode[i]);
                    
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Data.ToString());
                }
               
                    return NewTreeNode[i];
                
             
            }        //在树中删除掉current结点
            public void DeleteNode(TreeNode current)
            {
                //移除当前结点
                tv.Nodes.Remove(current);
            }        //遍历树,产生代码
            public String TraversalTree()
            {
                
                //深度优先遍历
                String str = "";            str = ShowAllNodes(this.tv.Nodes);
              
                return str;
            }        //采用递归的方式遍历树,输出代码
            String ShowAllNodes(TreeNodeCollection tv)
            {
                strCode = "int main()\n{\n";
                foreach (TreeNode node in tv)
                {
                    
                    strCode += PrintCode(node) ;
                    if (node.Nodes.Count > 0)
                    {
                        ShowAllNodes(node.Nodes);
                    }
                }
                return strCode;
            }
                
            //输出单个按钮的代码
            public String PrintCode(TreeNode tn)
            {
               //这里TreeNode始终没有变
                CybotButton cb = (CybotButton)tn.Tag;
                String str = cb.GenerateCode();
                return str;
            }        //在树中寻找包含有按钮cb的结点,并返回这个结点
            public TreeNode FindNode(TreeView tv,CybotButton cb)
            {
                TreeNode tnRet = new TreeNode("tnRet");
                foreach (TreeNode tn in tv.Nodes)
                {
                    if ((CybotButton)(tn.Tag) == cb)
                    {
                        tnRet = tn;
                        this.current = tnRet;
                        break;
                    }
                }
                return tnRet;
            }        //将以root为根的树整个删掉
            public bool DeleteTree()
            {
                //移除根结点及其所有子结点
                this.tv.Nodes.Remove(root);
                return true;
            }
            public TreeNode[] NewTreeNode;
            public String strCode;
            public TreeNode root;
            private TreeNode current;
            public TreeView tv;
            public static int i = 0;
            
        }
    }
                                 
      

  3.   

    public TreeNode AddNode(CybotButton cb,TreeNode parentNode) 
            { 
                //新建一个数组 
                try 
                { 
                    ++i; 
                    NewTreeNode[i] = new TreeNode(i.ToString()); 
                    NewTreeNode[i].Text = i.ToString(); 
                    NewTreeNode[i].Tag = cb; 
                    
                    
                    parentNode.Nodes.Add(NewTreeNode[i]); 
                    
                } 
                catch (Exception e) 
                { 
                    MessageBox.Show(e.Data.ToString()); 
                } 
              
                    return NewTreeNode[i]; 
                
            
            }
      

  4.   

    TreeNode rootNode = new TreeNode();//根节点
    TreeNode secNode1 = new TreeNode();//二级节点
    TreeNode secNode2 = new TreeNode();//二级节点rootNode.Nodes.Add(secNode1);
    rootNode.Nodes.Add(secNode2);这样也不可以吗?你不要粘你的全部代码,我看到头晕。
    贴出思想就可以了
      

  5.   

    问题不在你这个类中,而是你添加TreeNode的执行代码中,不过发现你这个类有点多余,特别是那个public TreeNode[] NewTreeNode; 添加的时候往里面塞了TreeNode,删除的时候却不去移除。
      

  6.   

    谢谢您,不过我的想法不是这样的,我的想法是,当点击一个按钮时,从后台找到和关联这个按钮的TreeNode,然后得到tag里面的按钮,从而更改按钮的属性。这个前提是按钮是放在TreeNode的Tag属性的,现在要做一种分支结构,当你把“分支按钮”放到TreeNode里时,它会自动在这个TreeNode下面建立四个分支。不知道我说没说明白。有点像一种自动机
      

  7.   

    呵呵,我水平不行啊,我原来是打算见一个变量,而不是数组,就是要动态的插入新Node,可是我发现,只用一个变量时会有问题,因此改成了数组
      

  8.   

    我有设置父节点,那个FindNode方法就是为了返回父节点的。其实这个类本身问题不大,问题是我要在前台建立一个带分支的按钮,当你连接上那个按钮时,就在后台动态的建立分支。原来的时候按钮都不带分支,我就把按钮放在TreeNode的Tag里了,现在按钮自己要建立分支,和这种做法矛盾了。不知道我说明白没有
      

  9.   

    恩,A kun。您对这个程序有啥意见?
      

  10.   

    不知道是先有鸡还是现有蛋!你现在的问题是,先有TreeView还是先有你所谓的“分支按钮”,不过我还真没见到你用什么结构来保存这种分支按钮的分支状态。
      

  11.   

    我有写过树,在blog里,不知对你有没帮助上面有代码http://blog.csdn.net/ProjectDD/archive/2009/12/28/5092500.aspx
      

  12.   

    可以看一下FindNode是不是有问题? 找不到tag == cb的情况下,所有的current都是tnRet。建议楼主好好理解下new的含义,不要动不动就new
      

  13.   

    您是说:“递归的遍历树?”我用了,ShowAllNode方法就是
      

  14.   

    方法我改了,改用了Composite模式,谢谢大家,结贴散分