数据库表中有ID,ParentId,name字段
通过递归函数产生树型目录
谁有简练易懂的代码阿,谢谢!!

解决方案 »

  1.   

    if(!IsPostBack)
    {
    TreeView1.Nodes.Clear();
    SqlDataReader dr=db.ExecuteSql("select * from 数据库表");
    while(dr.Read())
    {
       TreeNode newNode=new TreeNode();
       newNode.Text = dr["ID"].ToString();
       newNode.ID = dr["name"].ToString();
       InitTree(newNode.Nodes, "0");
    }
    }
    ======================================private void InitTree(TreeNodeCollection Nds,string parentId)
    {
    DataRow[] rows;
    rows=ds.Tables[0].Select("parentId='"+parentId+"'");
    TreeNode temNd;
    foreach(DataRow row in rows)
    {
    temNd=new TreeNode();
    temNd.ID=row["Id"].ToString();
    temNd.Text=row["Name"].ToString();
    Nds.Add(temNd);
    InitTree(temNd.Nodes,temNd.ID);
    }
    }=================
    没测试 大概是这个意思 根节点为0
      

  2.   

    根节点不唯一的
    ParentId为空时都为根的!
      

  3.   

    if(!IsPostBack)
    {
    TreeView1.Nodes.Clear();
    SqlDataReader dr=db.ExecuteSql("select * from 数据库表");
    while(dr.Read())
    {
       TreeNode newNode=new TreeNode();
       newNode.Text = dr["ID"].ToString();
       newNode.ID = dr["name"].ToString();
       if(dr["parentId"].ToSting()=="")
        {
           TreeView1.Nodes.Add(newNode);
           InitTree(newNode.Nodes, dr["ID"].ToString());
        }
    }
    }
    =================
    这样试试 思路是 当节点的parentId时,说明时根节点。 它的ID是别人的父节点
      

  4.   

    //.net2.0 递归实现 数据库读取改成自己的即可
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    public partial class _Default : System.Web.UI.Page
    {
        private string connstring = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();    private bool isHaveCheckBox = false;
        private bool isExpanded = false;
        private DataTable dtTree = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            //Response.Write("tttttttttt");
            if (!IsPostBack)
            {
                AreaTree.Nodes.Add(getRootAreaTreeNode(false, false));
            }           }    /// <summary>
        /// 获取包含全部子节点的根节点数据
        /// </summary>   
        /// <param name="haveCheckBox">节点是否产生CheckBox</param>
        /// <param name="expanded">节点是否展开</param>    
        /// <returns></returns>
        public TreeNode getRootAreaTreeNode(bool haveCheckBox, bool expanded)
        {
            //drPeng.HS.BR.AreaTree brTree = new drPeng.HS.BR.AreaTree();        string rootID = "0001";//brTree.getRootAreaTreeID();
            string rootName = "中国";//brTree.getRootAreaTreeName();
            //ds = brTree.getAllAreaTree();        isHaveCheckBox = haveCheckBox;
            isExpanded = expanded;        #region populate root node
            TreeNode rootNode = new TreeNode();
            rootNode.Text = rootName;
            rootNode.Value = rootID;
            //rootNode. = rootName;
            // rootNode.NodeData = "0001";
            
            rootNode.Expanded = true;
            // rootNode.CheckBox = isHaveCheckBox;
            #endregion        DataSet dsTree = SqlHelper.ExecuteDataset(connstring, CommandType.Text, "select * from TB_Area");
            dtTree = dsTree.Tables[0];
            this.populateAreaTree(rootID, rootNode);        return rootNode;
        }    private void populateAreaTree(string parentID, TreeNode pNode)
        {                DataRow[] dRows = dtTree.Select("ParentAreaCode='" + parentID +"'");
           
            if (dRows.Length > 0)
            {
                TreeNode Node = null;
                foreach (DataRow drow in dRows)
                {
                    Node = new TreeNode();
                    Node.Text = drow["AreaName"].ToString();
                    Node.Value = drow["AreaCode"].ToString();
                    //Node.DataItem = Node.Text + "|" + Node.Value;
                    Node.Expanded = isExpanded;
                    pNode.ChildNodes.Add(Node);
                    populateAreaTree(Node.Value, Node);     //递归 
                }            
            }
        }
    }
      

  5.   

    下面第二个FillTree是我用的一个函数,是用在框架中,点击某个节点另一个框架显示另外页面并传参数过去。第一个FillTree是示例。如果你不需要导航,把相应参数去掉即可。private void FillTree()
    {
        string strUrl = "跳转页.aspx";
        DepartSet ds = new DepartSet();
        DepartSetTableAdapters.DepartmentsTableAdapter adp = new DepartSetTableAdapters.DepartmentsTableAdapter();
        adp.Fill(ds.Departments);
        tvDeparts.Nodes.Clear();
        FillTree(ds.Departments, tvDeparts.Nodes, "-1", "ParentID", "SerialNum", "DepartName", "DepartID", strUrl, "Content");
    }
    /// <summary>
    /// 填充树控件
    /// </summary>
    /// <param name="dt">树控件结构所在表</param>
    /// <param name="tns">节点集合</param>
    /// <param name="strParentID">父节点值</param>
    /// <param name="strParentField">父节点字段</param>
    /// <param name="strSortField">排序字段</param>
    /// <param name="strTextField">显示文本字段</param>
    /// <param name="strValueField">值字段</param>
    /// <param name="strNavigate">导航页</param>
    /// <param name="strTarget">导航目标</param>
    public void FillTree(DataTable dt, TreeNodeCollection tns, string strParentID, string strParentField, string strSortField, string strTextField, string strValueField, string strNavigate, string strTarget)
    {
        TreeNode tn = null;
        DataRow[] drs = dt.Select(string.Format("{0}={1}", strParentField, strParentID), strSortField);    foreach (DataRow dr in drs)
        {
           tn = new TreeNode();
           tn.Text = dr[strTextField].ToString();
           tn.Value = dr[strValueField].ToString();
           tn.NavigateUrl = string.Format("{0}?P={1}", strNavigate, dr[strValueField]);
           tn.Target = strTarget;
           tns.Add(tn);       FillTree(dt, tn.ChildNodes, dr[strValueField].ToString(), strParentField, strSortField, strTextField, strValueField, strNavigate, strTarget);
       }
    }
      

  6.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class word_admin_left : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            try
            {
                Class1 aa = new Class1();
                string sql = "select * from tbTree";
                SqlDataAdapter adp = aa.SQLDA(sql);
                DataSet ds = new DataSet();
                adp.Fill(ds);
                this.ViewState["ds"] = ds;
            }
            catch (Exception ex)
            {
                Session["Error"] = ex.ToString();
                Response.Redirect("error.aspx");       //?跳转程序的公共错误处理页面
            }
            //调用递归函数,完成树形结构的生成
            if (!Page.IsPostBack)
            {
                AddTree(0, (TreeNode)null);
            }    }    //递归添加树的节点
        public void AddTree(int ParentID, TreeNode pNode)
        {
            DataSet ds = (DataSet)this.ViewState["ds"];
            DataView dvTree = new DataView(ds.Tables[0]);
            //过滤ParentID,得到当前的所有子节点
            dvTree.RowFilter = "[PARENTID] = " + 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;
                    AddTree(Int32.Parse(Row["id"].ToString()), Node);    //再次递归
                }
                else
                {   //?添加当前节点的子节点
                    Node.Text = Row["name"].ToString();
                    Node.NavigateUrl = Row["url"].ToString();
                    pNode.ChildNodes.Add(Node);
                    Node.Expanded = true;
                    AddTree(Int32.Parse(Row["id"].ToString()), Node);     //再次递归
                }
            }
        }            
    }
      

  7.   

    using .......namespace.......Your Page className....protected SqlConnection con;
    protected SqlDataAdapter sda;
    protected SqlCommand com;private Page_Load(object sender, System.EventArgs e)
    {
        con=new SqlConnection("Data Source=.;Initial Catalog=[Your DB Name];Integrated Security=True;user id=sa;password=");
       sda=new SqlDataAdapter();
       com=new SqlCommand();
    com.Connection=con;
    sda.SelectCommand=com;
    AddToTreeView(null);//添加根节点}private void AddToTreeView(TreeNode n)
    {           
                
                
                DataTable dt;
                TreeNode tn;            if (n == null)
                {
                    sda.SelectCommand = "select * from [Table Name] where parentId is null";
                }
                else
                {
                    sda.SelectCommand = "select * from [Table Name] where parentId="+tn.Value;
                }
                sda.Fill(dt);
                foreach (DataRow r in dt.Rows)
                {
                    
                    tn = new TreeNode(r[2].ToString());
                    tn.Value = r[0].ToString();//把ID值放在Value属性里;
                    if (n == null)
                    {
                        this.TreeView1.Nodes.Add(tn);
                    }
                    else
                    {
                        n.ChildNodes.Add(tn);
                    }
                    AddToTree(tn);
                }
    }
      

  8.   

    hertcloud(·£孙子兵法£·) ( ) 信誉:100    Blog   加为好友  2007-3-9 22:10:07  得分: 15  
    你的方法还缺少个引用就是需要下载DataAccessApplicationBlock.msi安装包后并且添加下面的using Microsoft.ApplicationBlocks.Data;才可以