做个递归:C#:
----------------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.NodeBind();//页面加载时解析数据库绑定TreeNode根节点
        }
    }    #region//数据库连接字符串
    public void conString()
    {
        string conStr = "server=.;uid=sa;pwd=;database=Demo";
        con = new SqlConnection(conStr);
    }
    #endregion    #region//页面加载时绑定TreeNode根节点
    public void NodeBind()
    {
        this.tvadd.Nodes[0].ChildNodes.Clear();//清空TreeView中所有节点
        this.tvadd.Nodes[0].Expanded = true;//设置根节点为展开形式
        this.AddChildNode("NULL",this.tvadd.Nodes[0]);
    }
    #endregion    #region//递归解析数据库中节点并绑定在TreeView控件上
    /// <summary>
    /// 递归解析数据库中节点并绑定在TreeView控件上
    /// </summary>
    /// <param name="sqltj">要解析库这个节点归属于哪个父节点</param>
    /// <param name="tn">要添加下一级节点的父节点</param>
    public void AddChildNode(string sqltj,TreeNode tn)
    {
        string sql = "select * from AddNodes where ParentID";//查询该父节点下还有无子节点SQL语句
        if (sqltj == "NULL")
        {
            sql += " IS NULL";//也就是说是根节点下面的第一级子节点
        }
        else
        {
            sql += "=" + sqltj;//查询sqltj下有无子节点
        }
        
        DataTable dt = this.dtDataBind(sql);
        if (dt.Rows.Count == 0)//说明此节点下无子节点
        {
            return;//退出
        }
        else
        {
            for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
            {
                TreeNode tnchild = new TreeNode();//创建新的子节点
                tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
                tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
                tnchild.Expanded = true;//设置为不展开节点
                tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
                //递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
                //i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
                //tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
                this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
            }
        }
    }
    #endregion    #region//绑定DataTable表
    public DataTable dtDataBind(string sql)
    {
        this.conString();
        da = new SqlDataAdapter(sql,con);
        dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
    #endregion

解决方案 »

  1.   

    sqlserver库设计:
    --------------------------------------------------------------
    ChildNodeID(主键 int)     ChildNodeType(varchar)    ParentID(int)
          1                          a                     <null>
          2                          b                     <null>
          3                          a1                      1
          4                          a2                      1
          5                          b1                      2生成代码:
    ------------------------------------------------------------------------
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AddNodes]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[AddNodes]
    GOCREATE TABLE [dbo].[AddNodes] (
    [ChildNodeID] [int] IDENTITY (1, 1) NOT NULL ,
    [ChildNodeType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [ParentID] [int] NULL 
    ) ON [PRIMARY]
    GO
      

  2.   

    treeview遍历XML文件:
    classXml.xml
    -------------------------------------------------------------------------
    <?xml version="1.0" encoding="utf-8" ?>
    <school>
      <class id="1"  name="classone">
        <student id="1" name="tom" sex="boy" />
          
        <student id="2" name="jey" sex="boy" />
          
        <student id="3" name="jam" sex="gril" />
          
        <student id="4" name="christina" sex="gril" />  </class>
      <class id="2"  name="classtwo">
        <student id="1" name="" sex="boy" />
          
        <student id="2" name="jane" sex="gril" />
          
        <student id="3" name="jett" sex="gril" />
          
        <student id="4" name="ateen" sex="gril" />
          
      </class>
      <class id="3"  name="classthree">
        <student id="1" name="bon jovi" sex="boy" />
          
        <student id="2" name="eminem" sex="boy" />
          
        <student id="3" name="babyface" sex="boy" />    <student id="4" name="shakira" sex="gril" />
          
      </class>
    </school>
    C#:
    -------------------------------------------------------------------
    using System.Xml;
    using System.Xml.XPath;
    ...
    XmlDocument xmlDoc;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.LoadXmlTree();
            }
        }    #region//TreeView_XML
        public void LoadXmlTree()
        {
            TreeView1.ShowLines = true;
            xmlDoc = new XmlDocument();
            xmlDoc.Load(Server.MapPath("classXml.xml"));
            XmlNodeList xnl = xmlDoc.SelectSingleNode("school").ChildNodes;
            TreeNode tnRoot = new TreeNode();
            tnRoot.Text = "school";
            tnRoot.Value = "-1";
            tnRoot.Expanded = true;
            TreeView1.Nodes.Add(tnRoot);
            this.TreeNodeBind(xnl,tnRoot);
        }    public void TreeNodeBind(XmlNodeList xnl, TreeNode tn)
        {
            foreach (XmlNode xnNext in xnl)
            {
                XmlElement xe = (XmlElement)xnNext;
                TreeNode tnNext = new TreeNode();
                if (xe.GetAttribute("name") != "")
                {
                    tnNext.Text = xe.GetAttribute("name");
                    tnNext.Value = xe.GetAttribute("name");
                }
                else if (xe.GetAttribute("id") != "" || xe.GetAttribute("sex")!="")
                {
                    tnNext.Text = xe.GetAttribute("id");
                    tnNext.Value = xe.GetAttribute("sex");
                }
                tnNext.Expanded = true;
                tn.ChildNodes.Add(tnNext);
                this.TreeNodeBind(xnNext.ChildNodes,tnNext);
            }
        }
        #endregion
      

  3.   

    递归没错,不过最好将数据库中的记录一次性全部读出来放到DataTable中,采用RowFilter或SelectRow等方法在此基础上进行递归筛选,减少与数据库交换数据的次数
      

  4.   

    我是说遍历TreeView大家不要写别的
      

  5.   

    你要想遍历 那就把这段代码改了呗:            foreach(DataRow dr in dt.Rows)
                {
                    TreeNode tnchild = new TreeNode();
                    tnchild.Text = dr[1].ToString();
                    tnchild.Value = dr[1].ToString();
                    tnchild.Expanded = true;
                    tn.ChildNodes.Add(tnchild);
                    this.AddChildNode(dr[0].ToString(),tnchild);
                }
      

  6.   

    你要想遍历 那就把这段代码改了呗:            foreach(DataRow dr in dt.Rows)
                {
                    TreeNode tnchild = new TreeNode();
                    tnchild.Text = dr[1].ToString();
                    tnchild.Value = dr[1].ToString();
                    tnchild.Expanded = true;
                    tn.ChildNodes.Add(tnchild);
                    this.AddChildNode(dr[0].ToString(),tnchild);
                }
    ---------------------
    改成什么??
      

  7.   

    这段代码:
    for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
                {
                    TreeNode tnchild = new TreeNode();//创建新的子节点
                    tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
                    tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
                    tnchild.Expanded = true;//设置为不展开节点
                    tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
                    //递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
                    //i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
                    //tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
                    this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
                }改成:
      foreach(DataRow dr in dt.Rows)
                {
                    TreeNode tnchild = new TreeNode();
                    tnchild.Text = dr[1].ToString();
                    tnchild.Value = dr[1].ToString();
                    tnchild.Expanded = true;
                    tn.ChildNodes.Add(tnchild);
                    this.AddChildNode(dr[0].ToString(),tnchild);
                }
      

  8.   

    你不是要循环绑定treeview的时候要用遍历  而不是循环嘛
    那就照着上面的改
      

  9.   

    给你个带三种便利方法的代码
    ---------------------------------------------------------- 
       //取得被选中的node
        private ArrayList GetTreeNodeList(TreeView objTreeView)
        {
            return GetTreeNodeList(objTreeView, 0);
        }
        //取得指定深度的node
        private ArrayList GetTreeNodeList(TreeView objTreeView, int intDeep)
        {
            return GetTreeNodeList(objTreeView, intDeep, false);
        }    //指定深度node下的子节点取得
        private ArrayList GetTreeNodeList(TreeView objTreeView, int intDeep, bool blnLeaf)
        {
            try
            {
                ArrayList treeNodeList = new ArrayList();            //取得被选中的node
                if (intDeep.Equals(0) && blnLeaf == false)
                {
                    for (int i = 0; i < objTreeView.CheckedNodes.Count; i++)
                    {
                        treeNodeList.Add(objTreeView.CheckedNodes[i]);
                    }
                }
                else
                {
                    //取得指定深度的node
                    if (!intDeep.Equals(0) && blnLeaf == false)
                    {                    for (int i = 0; i < objTreeView.CheckedNodes.Count; i++)
                        {
                            if (objTreeView.CheckedNodes[i].Depth == intDeep)
                            {
                                treeNodeList.Add(objTreeView.CheckedNodes[i]);
                            }
                        }
                    }
                    else
                    {
                        //指定深度node下的子节点取得
                        if (!intDeep.Equals(0) && blnLeaf != false)
                        {
                            TreeNodeCollection treeNodeSource = objTreeView.CheckedNodes;
                            ArrayList arrayNodes = new ArrayList();                        for (int i = 0; i < treeNodeSource.Count; i++)
                            {
                                if (treeNodeSource[i].Depth == intDeep)
                                {
                                    arrayNodes.Add(treeNodeSource[i]);
                                }
                            }
                            for (int j = 0; j < arrayNodes.Count; j++)
                            {
                                //LeafNodeを取得
                                GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
                            }
                        }
                    }
                }
                return treeNodeList;
            }
            catch
            {
                throw;
            }
        }    //LeafNodeを取得
        private void GetLeafNodes(TreeNode treeNode, ArrayList treeNodeList)
        {
            try
            {
                if (treeNode.ChildNodes.Count.Equals(0))
                {
                    treeNodeList.Add(treeNode);
                }
                else
                {
                    for (int m = 0; m < treeNode.ChildNodes.Count; m++)
                    {
                        GetLeafNodes(treeNode.ChildNodes[m], treeNodeList);
                    }
                }
            }
            catch
            {
                throw;
            }
        }
      

  10.   

    TreeNode myNode = new TreeNode(SchoolTypeName);
            string strsql="select * from uf_GetUserRolePower('"+UserInfo.SchoolNo+"','"+UserInfo.UserName+"')   order by aa,PnodeNum";
            SqlDataReader dr = DataAccess.GetReaderResult("Select IsAdmin from TeacherInfo where SchoolNo='" + UserInfo.SchoolNo + "' and TeacherId='"+UserInfo.UserName+"'");
            if (dr.Read()) 
            {
                if(dr.GetValue(0).ToString()=="1")
                    strsql = "select *,'0' Power from (select *,'1' aa from Sys_PowerNode union select *,'2' aa from Sys_PowerNode1)bb  order by aa desc,PnodeNum";
            }
            DataSet ds = DataAccess.GetResult(strsql);
            DataRow[] dt = ds.Tables[0].Select("len(PnodeNum)=2");
            for (int i = 0; i < dt.Length;i++ )
            {
                TreeNode childNode = new TreeNode();
                childNode.Text = dt[i]["PnodeName"].ToString();
                if (dt[i]["PNodePage"].ToString() != "")
                {
                    childNode.NavigateUrl = dt[i]["PNodePage"].ToString();
                    childNode.Target = dt[i]["PNodeTarget"].ToString();
                }
                else
                {
                    childNode.NavigateUrl = "#";
                    childNode.Target = "_self";
                }
                GetChildNodes(dt[i]["PnodeNum"].ToString(), ref childNode, dt[i]["aa"].ToString(), ds);
                myNode.ChildNodes.Add(childNode);
            }
            TreeView1.Nodes.Add(myNode);
        }    private void GetChildNodes(string parentnode,ref TreeNode parentNode,string type,DataSet ds)
        {
            //DataSet ds = DataAccess.GetResult("select * from uf_GetUserRolePower('" + UserInfo.SchoolNo + "','" + UserInfo.UserName + "') where substring(pnodenum,1," + parentnode.Length + ")='" + parentnode + "' and len(PnodeNum)-2=" + parentnode.Length + " and aa='" + type + "' and (Power='" + Power + "' or Power='0') order by PnodeNum");
            DataRow[] dt = ds.Tables[0].Select("substring(pnodenum,1," + parentnode.Length + ")='" + parentnode + "' and len(PnodeNum)-2=" + parentnode.Length + " and aa='" + type + "' and (Power='" + Power + "' or Power='0')");
            for (int i = 0; i < dt.Length;i++ )
            {
                TreeNode childNode = new TreeNode();
                childNode.Text = dt[i]["PnodeName"].ToString();
                if (dt[i]["PNodePage"].ToString() != "")
                {
                    childNode.NavigateUrl = dt[i]["PNodePage"].ToString();
                    childNode.Target = dt[i]["PNodeTarget"].ToString();
                }
                else
                {
                    childNode.NavigateUrl = "#";
                    childNode.Target = "_self";
                }
                GetChildNodes(dt[i]["PnodeNum"].ToString(), ref childNode, type, ds);
                parentNode.ChildNodes.Add(childNode);
            }
        }
      

  11.   

    单纯的便利所有节点,这样就行了
    -----------------------------------------------------
    private ArrayList GetTreeNodeList(TreeView objTreeView)
        {
            try
            {
                ArrayList arrayNodes = new ArrayList();            for (int j = 0; j < objTreeView.Nodes.Count; j++)
                {
                    //LeafNodeを取得
                    GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
                }            return treeNodeList;
            }
            catch
            {
                throw;
            }
        }  
        //LeafNodeを取得
        private void GetLeafNodes(TreeNode treeNode, ArrayList treeNodeList)
        {
            try
            {
                if (treeNode.ChildNodes.Count.Equals(0))
                {
                    treeNodeList.Add(treeNode);
                }
                else
                {
                    for (int m = 0; m < treeNode.ChildNodes.Count; m++)
                    {
                        GetLeafNodes(treeNode.ChildNodes[m], treeNodeList);
                    }
                }
            }
            catch
            {
                throw;
            }
        }
      

  12.   

    GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
    改为
     GetLeafNodes((objTreeView.Nodes[j]], treeNodeList);
      

  13.   

    GetLeafNodes((TreeNode)arrayNodes[j], treeNodeList);
    改为
     GetLeafNodes((objTreeView.Nodes[j]], arrayNodes );