下面的数据是自动生成的,生成树形菜单,如果我要在数据库读取数据,ID,parentID,Name,该怎么改呢?private DataTable GetAllDatas()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("ParentID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns[0].AutoIncrement = true;
            dt.Columns[0].AutoIncrementSeed = 1;            CreateChild(dt, 0, 2);            return dt;
        }        /// <summary>
        /// 生成节点的子孙节点
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="parentId"></param>
        /// <param name="curLevel"></param>
        private void CreateChild(DataTable dt, int parentId, int curLevel)
        {
            curLevel--;
            if (curLevel >= 0)
            {
                for (int i = 0; i < 4; i++)
                {
                    DataRow dr = dt.NewRow();                    
                    dr[1] = parentId;
                    dr[2] = String.Format("Tree Item_{0}", dt.Rows.Count);
                    dt.Rows.Add(dr);                    CreateChild(dt, dt.Rows.Count, curLevel);
                } 
            }
        }

解决方案 »

  1.   


    TreeView控件可以通过递归方式绑定数据库数据,代码如下:
        void Page_Load()
        {
            if (!Page.IsPostBack)
                PopulateTreeView();
        }
        private void PopulateTreeView()
        {
            DataTable treeViewData = http://www.cnblogs.com/zhouhb/archive/2012/02/11/GetTreeViewData();
            AddTopTreeViewNodes(treeViewData);  //绑定父节点
        }
        private DataTable GetTreeViewData()    //获取数据
        {
            string selectCommand = "SELECT MessageId,ParentId,Subject FROM Discuss";
            string conString = WebConfigurationManager.ConnectionStrings["Discuss"].ConnectionString;
            SqlDataAdapter dad = new SqlDataAdapter(selectCommand, conString);
            DataTable dtblDiscuss = new DataTable();
            dad.Fill(dtblDiscuss);
            return dtblDiscuss;
        }
        private void AddTopTreeViewNodes(DataTable treeViewData)
        {
            DataView view = new DataView(treeViewData);
            view.RowFilter = "ParentID IS NULL";
            foreach (DataRowView row in view)
            {
                TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
                TreeView1.Nodes.Add(newNode);
                AddChildTreeViewNodes(treeViewData, newNode);//绑定子节点
            }
        }
        private void AddChildTreeViewNodes(DataTable treeViewData, TreeNode parentTreeViewNode)
        {
            DataView view = new DataView(treeViewData);
            view.RowFilter = "ParentID=" + parentTreeViewNode.Value;
            foreach (DataRowView row in view)
            {
                TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
                parentTreeViewNode.ChildNodes.Add(newNode);
                AddChildTreeViewNodes(treeViewData, newNode);//递归,绑定子节点
            }
        }
    数据表中记录通过ParentId字段指定父节点。
    详细介绍可以参考:《ASP.NET2.0揭秘卷1》
     树节点TreeNode的重要属性:
    Text:节点显示内容
    Value:节点对应值
    NavigateUrl:导航页面Url
    Target:目标框架
    ImageUrl:节点图像页面扔一个treeview控件
      

  2.   

    如果你还是想按照你给出代码的逻辑 做出树数据 而不是直接采用控件(或者第三方控件) 那么你肯定得改。
    比如:
    首先定义个所有树数据的dt(id name parentid);
    首先获取所有的父节点(select * from table where parentid=0)=>dtFirst,
    再foreach(dtFirst),填充到dt,调用getChildsByLevel(parentid,level)也填充到dt
    getChildsByLevel(parentid,level)这是个递归方法即里面会循环递归调用自己获得数据 返回dt
    这样就会得到所有的数据已树的形式.当然也你可以直接考虑直接写一个递归方法 然后返回数据其实没必要自己去写这种拉 还是使用treeview控件 或者第三方控件比如(zTree) 只要给他id parentid他则会自己给你生成树.