如何无限极地动态添加节点。比如:表里面有两个字段 nodes ,parenodes。 1 2 , 2  3 , 3  4 , 4  5 这样如何建立一个树添加进去,找我会。如何添加就是TREENODE.NODES.ADD 这个方法。。麻烦

解决方案 »

  1.   

    一:设置表的级别和编码规则 用case 
    二:递归
      

  2.   

    必须要先用递归,找到你想添加结点的父结点,再调用这个父结点的add方法,把子结点的对象添加上去~
      

  3.   


    /// <summary>
            /// 菜单加载
            /// </summary>
            public void BindTree(string strAdminName, string strRoleName)
            {
                DataTable dtParent = tools.ConvertDataReaderToDataTable(bmdb.getParentMenu());  //父菜单表
                DataTable dtRolePower = null;
                if (strRoleName == "")
                {//如果角色名为空,则以用户名查询角色权限
                    dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu(strAdminName, ""));//根据登录用户获取其所属角色拥有权限表
                }
                else
                {
                    dtRolePower = tools.ConvertDataReaderToDataTable(bmdb.getPowerMenu("", strRoleName));//根据登录用户获取其所属角色拥有权限表
                }
                TreeView tvMenu = (TreeView)this.FindControl("tvMenu");
                TreeNode PNode = null;
                TreeNode CNode = null;
                foreach (DataRow dr in dtParent.Rows)
                {
                    PNode = new TreeNode();
                    PNode.Text = dr["MODULE_NAME"].ToString();  //父菜单名称
                    PNode.Value = dr["MODULEID"].ToString();    //父菜单值
                    PNode.SelectAction = TreeNodeSelectAction.Expand;
                    PNode.ExpandAll();
                    this.tvMenu.Nodes.Add(PNode);                //PNode.NavigateUrl = "javascript:return false;";                DataTable dtChild = tools.ConvertDataReaderToDataTable(bmdb.getChildMenu(Convert.ToInt32(PNode.Value)));
                    for (int i = 0; i < dtChild.Rows.Count; i++)
                    {
                        CNode = new TreeNode();  //必须声明
                        CNode.Text = dtChild.Rows[i]["MODULE_NAME"].ToString();
                        CNode.Value = dtChild.Rows[i]["MODULEID"].ToString();                    //CNode.NavigateUrl = dtChild.Rows[i]["MODULE_URL"].ToString(); //具体导航到的页面
                        foreach (DataRow dr2 in dtRolePower.Rows)
                        {
                            if (Convert.ToInt32(CNode.Value) == Convert.ToInt32(dr2[0].ToString()))
                            {
                                CNode.Checked = true;
                            }
                        }
                        PNode.ChildNodes.Add(CNode);
                    }
                }
            }
    然后在Page_Load里面调用
      

  4.   

    我再说下另一个方法定义:        public void addtee(int nodes, string parenodes)
            {
                TreeNode node = new TreeNode(nodes.ToString());
                node.Name = nodes.ToString();
                node.Text = parenodes.ToString();
                treeView1.Nodes.Add(node);
            }调用:addtee(re["nodes"].ToString(), re["parenodes"].ToString());
      

  5.   

    http://topic.csdn.net/u/20081222/17/ffd859b9-39dd-420f-be6d-1891b51c1491.html
      

  6.   

    http://www.cnblogs.com/mushroom_lb/archive/2008/08/26/1276449.html
    请参考一下
      

  7.   

    //----表结构CREATE TABLE  T_Dept(
    DeptIndex numeric(18, 0) IDENTITY(1,1) NOT NULL,
    DeptID nvarchar(20)  NOT NULL,--部门ID,节点
    DeptTreeParent nvarchar(20)  NOT NULL,--所属部门,父节点
    DeptTreeDepth numeric(18, 0) NOT NULL,--所在树深度
    DeptPresiderID nvarchar(20)  NULL,--主负责人ID(副总、经理、队长)
    DeptAssistantID nvarchar(20)  NULL,--副负责人ID
    DeptRe ntext  NULL,--备注
    DepMoney numeric(18, 0)  DEFAULT 500 NULL,--允许领用货品的总金额
     CONSTRAINT PK_T_Dept PRIMARY KEY (DeptID) 
    )  int iDepth = this.treeView1.SelectedNode.FullPath.Split('\\').Length - 1;
                   
    //----------------------------------------------
    #region 刷新/加载TreeView
            /// <summary>
            /// 刷新TreeView(根节点名及Text值相同)
            /// </summary>
            private void RefTreeView()
            {
                this.treeView1.Nodes[0].Nodes.Clear();
                string strSQL = "SELECT * FROM T_Dept Order By             DeptTreeDepth,DeptIndex";
                DataSet ds = DBUtility.DbHelperSQL.Query(strSQL);
                DataTable dt = ds.Tables[0];
                TreeNode tred = treeView1.Nodes[0];//
                Pub.AddTree(tred.Name, tred, treeView1, dt);
            }
            #endregion
            #region 遍历TreeView的方法
            /// <summary>
            /// 根据数据库创建TreeView的方法
            /// </summary>
            /// <param name="ParentID">父节点</param>
            /// <param name="pNode">节点</param>
            /// <param name="treeView">控件</param>
            /// <param name="dt">数据库表结构</param>
            public static void AddTree(string ParentID, TreeNode pNode, TreeView treeView, DataTable dt)
            {
                DataView dvTree = new DataView(dt);
                //过滤ParentID,得到当前的所有子节点
                dvTree.RowFilter = "[DeptTreeParent]='" + ParentID + "'";
                foreach (DataRowView Row in dvTree)
                {
                    TreeNode Node = new TreeNode();
                    //?添加当前节点的子节点
                    Node.Text = Row["DeptID"].ToString();
                    pNode.Nodes.Add(Node);
                    //Node.Expanded = true;
                    AddTree(Row["DeptID"].ToString(), Node, treeView, dt);//递归
                }
            }
            #endregion
    呵呵,资源共享,希望对你有所帮助
      

  8.   

    呵呵 我正在写这方面的一个小论文 递归算法!
    //以下为关于树的操作////////////////////////////////////////////////////////////////////////////////////////////////////////
            /// <summary>
            /// 递归算法生成树型结构
            /// </summary>
            /// <param name="strcdid"></param>
            /// <returns></returns>
            public void InitTree(TreeNodeCollection Nds, string parentID)      // 方法输入值(结点集合,父节点的ID) 
            {
                TreeNode NewNode;
                DataTable dtTree = new DataTable();
                ReadWriteDB dbTree = new ReadWriteDB();
                dtTree = dbTree.GetTreeInfo(dbTree.companyID);   //根据xml文件中的companyID获取树型信息表            DataRow[] rows = dtTree.Select("SUPERIORORG='" + parentID + "'");
                foreach (DataRow row in rows)
                {                NewNode = new TreeNode(row["ORGNAME"].ToString());
                    NewNode.Tag = row["ORGID"].ToString();
                    Nds.Add(NewNode);
                    if (parentID == "1")
                    {
                        NewNode.ImageIndex = 0;
                    }
                    else
                    {
                        NewNode.ImageIndex = 1;
                        NewNode.SelectedImageIndex = 2;
                    }
                    InitTree(NewNode.Nodes, row["ORGID"].ToString());
                    //InitTree(Nds(Nds.Count-1), row["ORGID"].ToString());
                    //else if (NewNode.Nodes.Count == 0)
                    //{
                    //    NewNode.ImageIndex = 3;
                    //    NewNode.SelectedImageIndex = 4;
                    //}
                }        }        /// <summary>
            /// 生成树结构后,在车队后添加线路列表(遍历节点,只在叶节点添加线路列表)
            /// </summary>
            private void AddLinesForTeam(TreeNode Node)
            {            TreeNode NewNode;
                ReadWriteDB rwDB = new ReadWriteDB();
                DataTable dtLines = new DataTable();
                ArrayList index = new ArrayList();
                
                //查找满足条件的结点
                foreach (TreeNode tn in Node.Nodes)
                {
                    if (tn.Nodes.Count == 0)  //叶节点才进行判断
                    {
                        dtLines = rwDB.GetLineList(tn.Text.ToString());
                        if (dtLines.Rows.Count > 0)   //若有记录
                        {
                            foreach (DataRow dtrow in dtLines.Rows)
                            {
                                NewNode = new TreeNode(dtrow["xlmc"].ToString());
                                NewNode.Tag = dtrow["xlid"].ToString();
                                tn.Nodes.Add(NewNode);
                                NewNode.ImageIndex = 3;
                                NewNode.SelectedImageIndex = 4;
                            }
                        }
                        else     //若该车队没有下属线路,则删除该节点(没有对客7 16队进行判断 有待进一步解决)
                        {
                            //先记录下没有下属线路的索引号 然后 将其都删除
                            index.Add(tn.Index);
                            //MessageBox.Show(tn.Text + "没有下属线路。");
                            //Node.Nodes.Remove(tn);
                            //将索引号加一              
                        }
                    }
                }            //可否用泛型
                //再对相应的索引节点进行删除操作
                for (int i = index.Count-1; i >=0; i--)
                {
                    //Node.Nodes.RemoveAt(Convert.ToInt32(index[i]));
                    Node.Nodes[Convert.ToInt32(index[i])].Remove();            }        }