数据库中有表:
ID   PID
1     0
2     0
3     1
4     2
5     2PID是ID的父目录,PID=0表示该目录最高级,如何生成目录树:
-1
 |-3
-2
 |-4
 |-5??

解决方案 »

  1.   

    简单的TreeView绑定而已,例子:
    private void Page_Load(object sender, System.EventArgs e)
    {
                // 在此处放置用户代码以初始化页面
                
                if(!Page.IsPostBack)
                {
                     DataTable dt = new DataTable();
                    dt.Columns.Add("f_i_autoid");
                    dt.Columns.Add("f_NodeId");
                    dt.Columns.Add("f_ParentNodeId");
                    dt.Columns.Add("f_Name");
                    dt.Rows.Add(new object[]{1,1,0,"AAA"});
                    dt.Rows.Add(new object[]{2,2,0,"BBB"});
                    dt.Rows.Add(new object[]{3,3,0,"CCC"});
                    dt.Rows.Add(new object[]{4,4,1,"DDD"});
                    dt.Rows.Add(new object[]{6,6,2,"EEE"});
                    dt.Rows.Add(new object[]{7,7,3,"FFF"});
                    dt.Rows.Add(new object[]{8,8,6,"GGG"});
                    dt.Rows.Add(new object[]{9,9,7,"HHH"});
                    this.DataList1.DataSource = dt;
                    this.DataList1.DataBind();
                 }
    }/// <summary>
    /// 用递归方法将数据中查询的数据添加TreeView控件的节点
    /// </summary>
    private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID)
    {
        DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'");    foreach(DataRow row in rows)
        {
            TreeNode newNode = new TreeNode();
            newNode.ID = row["f_NodeId"].ToString();
            newNode.Text = row["f_Name"].ToString();
            notes.Add(newNode);
            this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID);        
        }
    }
      

  2.   

    贴错了,更正:
    private void Page_Load(object sender, System.EventArgs e)
    {
                // 在此处放置用户代码以初始化页面
                
                if(!Page.IsPostBack)
                {
                     DataTable dt = new DataTable();
                    dt.Columns.Add("f_i_autoid");
                    dt.Columns.Add("f_NodeId");
                    dt.Columns.Add("f_ParentNodeId");
                    dt.Columns.Add("f_Name");
                    dt.Rows.Add(new object[]{1,1,0,"AAA"});
                    dt.Rows.Add(new object[]{2,2,0,"BBB"});
                    dt.Rows.Add(new object[]{3,3,0,"CCC"});
                    dt.Rows.Add(new object[]{4,4,1,"DDD"});
                    dt.Rows.Add(new object[]{6,6,2,"EEE"});
                    dt.Rows.Add(new object[]{7,7,3,"FFF"});
                    dt.Rows.Add(new object[]{8,8,6,"GGG"});
                    dt.Rows.Add(new object[]{9,9,7,"HHH"});                this.BindTreeNode(this.TreeView1.Nodes,dt,"0");
                 }
    }/// <summary>
    /// 用递归方法将数据中查询的数据添加TreeView控件的节点
    /// </summary>
    private void BindTreeNode(TreeNodeCollection notes,DataTable dataTB,string parentID)
    {
        DataRow[] rows = dataTB.Select("[f_ParentNodeId]='" + parentID + "'");    foreach(DataRow row in rows)
        {
            TreeNode newNode = new TreeNode();
            newNode.ID = row["f_NodeId"].ToString();
            newNode.Text = row["f_Name"].ToString();
            notes.Add(newNode);
            this.BindTreeNode(newNode.Nodes,dataTB,newNode.ID);        
        }
    }
      

  3.   

    是这样吗?
        private void BindTreeNode(TreeNodeCollection notes, DataTable dataTB, string parentID)
        {
            DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'");        foreach (DataRow row in rows)
            {
                TreeNode newNode = new TreeNode();
                newNode.Value = row["id"].ToString();
                newNode.Text = row["chinesename"].ToString();
                notes.Add(newNode);
                this.BindTreeNode(notes, dataTB, newNode.Value);        }
        }这样的话全部都编成根目录了
      

  4.   

    请问零零伍:
    我怎么提示TreeNodeCollection 出错,查msdn是windows继承的类?
      

  5.   

    oh~不好意思,搞错了    private void BindTreeNode(TreeNodeCollection notes, DataTable dataTB, string parentID)
        {
            DataRow[] rows = dataTB.Select("[parentid]='" + parentID + "'");        foreach (DataRow row in rows)
            {
                TreeNode newNode = new TreeNode();
                newNode.Value = row["id"].ToString();
                newNode.Text = row["chinesename"].ToString();
                notes.Add(newNode);
                this.BindTreeNode(newNode.ChildNodes, dataTB, newNode.Value);
            }
        }这样才对。谢谢Eddie005(♂) №.零零伍 的算法,确实不错
      

  6.   

    private void InitTreeView(TreeNodeCollection nds,int nodeid)
        {
            DataRow[] noderows = ds.Tables[0].Select("ParentID="+nodeid);
            TreeNode node;
            foreach (DataRow row in noderows)
            {
                    node = new TreeNode();
                    node.Value = row["id"].ToString();
                    node.Text = row["Name"].ToString();
                       nds.Add(node);
                                                   InitTreeView(node.ChildNodes, Convert.ToInt32(row["WebID"].ToString()));
                }
    }用上面这个递归
      

  7.   

    我这个表的结构是
    ID UnitName PID
    我的程序是这样写的,你可以小改下,原理是第一步把PID=0的取出来,然后再递归读下面的。
    private void BiudTree()
    {
    Units sm=new Units();
    DataTable dt=sm.GetList("DelSign='0'").Tables[0];
    this.dopUnits.Items.Clear();
    //加载树
    //this.dopUnits.Items.Add(new ListItem("根目录","0"));
    DataRow [] drs = dt.Select("PID= " + 0);
    foreach( DataRow r in drs )
    {
    string nodeid=r["ID"].ToString();
    string text=r["UnitName"].ToString();
    //string parentid=r["ParentID"].ToString();
    //string permissionid=r["PermissionID"].ToString();
    text="╋"+text;
    this.dopUnits.Items.Add(new ListItem(text,nodeid));
    int sonparentid=int.Parse(nodeid);
    string blank="├";

    BindNode( sonparentid, dt,blank); }
    this.dopUnits.DataBind(); }
    private void BindNode(int parentid,DataTable dt,string blank)
    {
    DataRow [] drs = dt.Select("PID= " + parentid );

    foreach( DataRow r in drs )
    {
    string nodeid=r["ID"].ToString();
    string text=r["UnitName"].ToString();
    //string permissionid=r["PermissionID"].ToString();
    text=blank+"『"+text+"』";

    this.dopUnits.Items.Add(new ListItem(text,nodeid));
    int sonparentid=int.Parse(nodeid);
    string blank2=blank+"─";
    BindNode( sonparentid, dt,blank2);
    }
    }
      

  8.   

    楼主,在vs2005中,用treeview控件,运行出错!!!这行:
    newNode.ID = row["f_NodeId"].ToString();报newNode不包含id的属性 
    怎么回事??高手是用2003做的?
      

  9.   

    将newNode.ID = row["f_NodeId"].ToString();
    改为newNode.value = row["f_NodeId"].ToString();
    就可以了,这是vs2005和vs2003的区别
      

  10.   

    不错,我也用Eddie005(♂) №.零零伍的递归作出来,感谢Eddie005(♂) №.零零伍!