数据库表结构
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        1 grade 代表级别 1,2,3
isEnd 是否为末级 0不是,1是//树的绑定
    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);//递归             } 
        }     } //PageLoad 事件
    protected void Page_Load(object sender, EventArgs e)
    {
      
        if (!IsPostBack)
        {
            BuilderTree(0, (TreeNode)null);
        }
     
    }
出来的结果是子节点都加在第一个父节点上了

解决方案 »

  1.   

    你这个表设计的冗余就很大3个字段就能解决问题id    name      parentId
    1     水果          0
    2     梨子          1
    3     香蕉          1
    4     汽车          0
    5     轿车          4
    6     速腾          5
    7     保罗          5
    8     卡车          4
    9     kav         8
    10     df          8
      

  2.   

    读取的时候就递归就好了
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                AddTree(0, (TreeNode)null);
            }
        }    public void AddTree(int ParentID, TreeNode pNode)
        {
            //获取你的表
            DataView dvTree = new DataView(ds.Tables[0]);        dvTree.RowFilter = "[id] = " + ParentID;        foreach (DataRowView Row in dvTree)
            {
                TreeNode Node = new TreeNode();
                if (pNode == null)
                {  
                    Node.Text = Row["name"].ToString();
                    Node.Value = Row["name"].ToString();
                    //可以设置跳转的页面
                    //Node.NavigateUrl = Row["NavigationUrl"].ToString();
                    //可以设置你鼠标移上去显示的提示
                    //Node.ToolTip = Row["description"].ToString();
                    TreeView1.Nodes.Add(Node);
                    //Node.Expanded = true;
                    AddTree(Int32.Parse(Row["id"].ToString()), Node); 
                }
                else
                {   
                    Node.Text = Row["name"].ToString();
                    Node.Value = Row["name"].ToString();
                    //Node.NavigateUrl = Row["NavigationUrl"].ToString();
                    //Node.ToolTip = Row["description"].ToString();                pNode.ChildNodes.Add(Node);
                    //Node.Expanded = true;
                    AddTree(Int32.Parse(Row["id"].ToString()), Node);
                }
            }
        } 思路就是先筛选父节点为0的,代表根节点,然后依次递归
      

  3.   

    建议你把数据库优化下
      绑定tree view 是有递归的方法 先绑定父级节点 
       接着使用tree view的TreeNodePopulate事件绑定父级节点下的子节点
       但是select语句要写好
      

  4.   

    TreeNodePopulate 也用了,但不知道为什么出来的是空页面
      

  5.   

    LZ啊,我仔细看了你代码,你是不是代码是单独找的,然后表示自己设计的?我们来仔细分析下
     dvTree.RowFilter = "[isEnd] = " + ParentID;//首先你parentId是0,你第1次筛选
    就把所有isEnd为0的筛选出来了
    结果是
    id      name    grade    isEnd 
    01      a        1          0 
    0101    b        2          0 02      d        1        0 03      f          1      0 
    然后进行递归,因为第1个节点的id 是01
    所以第2次调用
    BuilderTree(int ParentID, TreeNode pNode) 这个方法的时候,paentid=1(你是用的INT,所以会被转化为1),noed为刚才的那个节点
    然后筛选
    就把所有isEnd为1的筛选出来了id      name    grade    isEnd 010102  c      3          1 0201    e        2        1 0301    g          2        1 你说会不会把所有节点加在第1个父节点上LZ你思路都没搞清楚啊.............
      

  6.   

    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        1 改表的设计,把isEnd 和 grade合并为 parentId
    id 编号按123....这样编如果是根节点,则 paerntId =0
    如果不是,则标记为它是属于哪个节点的子节点你那个表改过来后应该是id      name    parentId
    1       a        0        
    2       b        1         
    3       c        2       
    4       d        0       
    5       e        4       
    6       f        0     
    7       g        6       这样就能用你那个代码了
      

  7.   

     public void Fin(TreeNode node )
        {
            string sql = "select * from inventoryclass where  grade=1";
            DataSet ResultSet = DBHelper.GetData(sql);
            foreach (DataRow row in ResultSet.Tables[0].Rows) //一级节点
            {
                TreeNode tn = new TreeNode(row["name"].ToString(), row["id"].ToString());
                this.TreeView1.Nodes.Add(tn);
                if (row["isEnd"].ToString() != "1")//二级
                {
                    string sqll = "select * from inventoryclass where  grade=2 and left(id,2)=" + tn.Value;
                    DataSet rs = DBHelper.GetData(sqll);
                    foreach (DataRow rows in rs.Tables[0].Rows)
                    {
                        TreeNode tns = new TreeNode(rows["name"].ToString(), rows["id"].ToString());
                        tn.ChildNodes.Add(tns);
                        if (rows["isEnd"].ToString() != "1")//若不为末级,三级
                        {
                            string sqlll = "select * from inventoryclass where  grade=3 and left(id,4)=" + tns.Value;
                            DataSet ds = DBHelper.GetData(sqlll);
                            foreach (DataRow dr in ds.Tables[0].Rows)
                            {
                                TreeNode tnn = new TreeNode(dr["name"].ToString(), dr["id"].ToString());
                                tns.ChildNodes.Add(tnn);
                                if (dr["isEnd"].ToString() != "1")//若不为末级,四级
                                {
                                    string sqllll = "select * from inventoryclass where grade=4 and left(id,6)=" + tnn.Value;
                                    DataSet dsf = DBHelper.GetData(sqlll);
                                    foreach (DataRow drf in dsf.Tables[0].Rows)
                                    {
                                        TreeNode tnf = new TreeNode(drf["name"].ToString(), drf["id"].ToString());
                                        tnn.ChildNodes.Add(tnf);
                                    }
                                }
                            }
                        }                }            }
            } 
        }