id       name grade isEnd
01       a    1       0
0101     b    2       0
010102   c    3      1
02       d    1       0
0201     e    2       1
03       f     1       0
0301     g    2        1grade 代表级别
isEnd 是否为末级
    private void BuilderTree(int ParentID, TreeNode pNode)
    {
        TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
        string sql = "select * from inventoryclass";
        DataSet ds = DBHelper.GetData(sql);
 
        DataView dvTree = new DataView(ds.Tables[0]);
        //过滤ParentID,得到当前的所有子节点
        dvTree.RowFilter = "[isEnd] = " + ParentID;
        foreach (DataRowView row in dvTree)
        {
            TreeNode Node = new TreeNode();
            if (pNode == null)
            {
                //添加根节点
                Node.Text = row["name"].ToString();
                TreeView1.Nodes.Add(Node);
                Node.Expanded = true;
                BuilderTree(int.Parse(row["id"].ToString()),Node);//递归
            }
            else
            {
                //添加当前节点的子节点
                Node.Text = row["name"].ToString();
                pNode.ChildNodes.Add(Node);
                Node.Expanded = true;
                BuilderTree(int.Parse(row["id"].ToString()), Node);//递归            }
        }    }
出来的结果是字节点都加在第一个父节点上了

解决方案 »

  1.   

    //自定义方法,给treeview榜定数据
        /// <summary>
        /// BindTree给Treeview绑定数据
        /// </summary>
        /// <param name="tv">TreeView</param>
        /// <param name="ds">DataSet</param>
        private void BindTree(TreeView tv,DataSet ds)
        {
            //得到数据条数
            int cnt = ds.Tables["User"].Rows.Count;
            //模块名称
            string ModuleName = "";
            //上条记录的模块名称
            string PreModuleName = "";
            //子模块名称
            string ChildName = "";
            //上条记录的子模块的名称
            string PreChildName = "  ";        //第一层节点
            TreeNode FirstNode = new TreeNode();
            //第二层节点
            TreeNode SecondNode = new TreeNode();
            
            //遍历所有记录,给各节点赋值
            for (int index = 0; index < cnt; index++)
            {
                //模块节点的名称
                ModuleName = ds.Tables["User"].Rows[index]["MODULE_NAME"].ToString();
                //子模块节点的名称
                ChildName = ds.Tables["User"].Rows[index]["CHILDMODULE_NAME"].ToString();
                //叶节点,并实例化
                TreeNode PageNode = new TreeNode();
                PageNode .Text = ds.Tables["User"].Rows[index]["PAGE_NAME"].ToString();
                PageNode.Value = ds.Tables["User"].Rows[index]["PAGE_ID"].ToString();
                PageNode.NavigateUrl = ds.Tables["User"].Rows[index]["PAGE_LINK"].ToString();
                PageNode.Target = STRTARGET;            //判断是否已经有过该节点,如无,添加新节点
                if (ModuleName != PreModuleName)
                {
                    TreeNode ModuleNode = new TreeNode();
                    ModuleNode.Target = "";
                    ModuleNode.Text = ModuleName;
                    tv.Nodes.Add(ModuleNode);
                    FirstNode = ModuleNode;
                    FirstNode.SelectAction = TreeNodeSelectAction.None;
                }            //判断子模块节点是否为空,并添加节点
                if ((ChildName != PreChildName) && (ChildName != ""))
                {
                    TreeNode ChildNode = new TreeNode();
                    ChildNode.Target = "";
                    ChildNode.Text = ds.Tables["User"].Rows[index]["CHILDMODULE_NAME"].ToString();
                    FirstNode.ChildNodes.Add(ChildNode);
                    SecondNode = ChildNode;
                    SecondNode.SelectAction = TreeNodeSelectAction.None;
                }            //针对不同情况,给叶子节点赋值
                if (ChildName.Equals(string.Empty))
                {
                    FirstNode.ChildNodes.Add(PageNode);
                }
                else
                {
                    SecondNode.ChildNodes.Add(PageNode);
                }            PreModuleName = ModuleName;
                PreChildName = ChildName;
            }
        }    三层节点与两层节点并存绑定值
      

  2.   

    数据库表中肯定有字段能表达出层次结构吧?
    比如说有个Parent字段?
      

  3.   

    grade 代表级别 1,2,3
    isEnd 是否为末级