一张数据表结构:  ID表示索引,自动生成;  FI表示 父栏目的ID;   Level表示所在的层级ID     FI      Level      Title
---  ------   -------    -------
1      0         0         新闻
2      1         1         国内
3      2         2         陕西
4      3         3         西安
5      0         0         体育
6      5         1         NBA
7      5         1         足球将这样的数据表解析成:├新闻
   ├国内
      ├陕西
         ├西安
├体育
   ├NBA
   ├足球

解决方案 »

  1.   

    楼主可以这样建表
    id   title  parent_id 自增列 标题   父id
    ---------------------
    1   新闻     0
    2   体育     0
    3   国内     1
    4   陕西     1
    5   西安     1
    6   NBA     2
    7   足球     2
      

  2.   

    就是一个递归算法private void BindXmlToTreeview(XmlNode xmlNode,TreeNodeCollection tnc) {
                
                tnc.Add(new TreeNode(xmlNode.Name));
                foreach(XmlNode n in xmlNode.ChildNodes)  {
                    BindXmlToTreeview(n, tnc[tnc.Count - 1].Nodes);
                }
            }
      

  3.   

    递归遍历数据
    通过FL获取child
    http://topic.csdn.net/u/20090220/18/15a0931d-c150-4cc6-8c8a-af2e9334a65b.html
      

  4.   

    给你一个我已经实现的代码,不过不知道适合不适合你的这个问题。不过估计是可以的,都是给tree加节点。我的就是无限极的。protected void Page_Load(object sender, EventArgs e)
        {
            this.nextLeveltreeView.Nodes.Clear();//清空        long idx = 0;        //设置一级id        if (Session["upLevel"] == null)
            {
                long s = long.Parse(Session["defaultLevel"].ToString());
                idx = s;
            }
            else//如果得到了
            {
                idx = long.Parse(Session["upLevel"].ToString());
            }        //调用添加的方法        this.nextLeveltreeView.Nodes.Add(GetNodeByIdx(idx));
            this.nextLeveltreeView.DataBind();
        }
        /// <summary>
        /// 根据idx获取根节点,以及其子节点
        /// </summary>
        /// <param name="idx"></param>
        /// <returns></returns>
        protected TreeNode GetNodeByIdx(long idx)
        {        zyb_Title title = new RoleToTitlteManagerClient().GetTitleById(idx);
           
            TreeNode root = ParseFromzyb_Title(title);        GetAllChildNodes(idx, root);        return root;    }
        /// <summary>
        /// 从zyb_Title实例转化为TreeNode
        /// </summary>
        /// <param name="title"></param>
        /// <returns></returns>
        protected TreeNode ParseFromzyb_Title(zyb_Title title)
        {
            TreeNode node = null;
            if (title != null)
            {
                node = new TreeNode();
                node.Value = title.ownLevel.ToString();
                node.Text = title.titleName;
                node.NavigateUrl = title.locationUrl;
                node.Target = "main";
            }
            return node;
        }
        /// <summary>
        /// 获取 跟进当前id获取当前节点下的所有子节点
        /// </summary>
        /// <param name="idx"></param>
        /// <param name="root"></param>
        protected void GetAllChildNodes(long idx, TreeNode root)
        {
            List<zyb_Title> ilist = new RoleToTitlteManagerClient().GetAllOwnLevelByUplevelId(idx);        if (ilist == null || ilist.Count == 0)
            {
                return;
            }
            else
            {
                foreach (zyb_Title title in ilist)
                {
                    TreeNode ChildNode = ParseFromzyb_Title(title);
                    root.ChildNodes.Add(ChildNode);                GetAllChildNodes(title.idx, ChildNode);//递归
                }
            }
        }
    页面上只有一个拖拽的treeView服务器的控件
      

  5.   

    我就按照你的数据结构给写一个:public void BindNode(TreeView trv)
    {
        StringBuilder strSql = new StringBuilder("SELECT ID,TITLE FROM Base_News WHERE ISNULL(FI,0)=0 ORDER BY ID ASC");
        SqlDataTable dt = DbHelper.ExecuteQuery(strSql.ToString());//获取所有父节点
         for(int i=0;i<dt.Rows.Count;i++)
         {
              TreeNode ParentNode = new TreeNode(dt.Rows[i]["TITLE"].ToString(),dt.Rows[i]["ID"].ToString());   
              trv.Nodes.Add(ParentNode);  
              BindChild(ParentNode);
         }
    }public void BindChild(TreeNode tn)
    {
         string strSql = "SELECT ID,TITLE FROM Base_News WHERE FI="+ tn.Value;
         SqlDataTable dt = DbHelper.ExecuteQuery(strSql.ToString());//获取参数节点的所有子节点
          for(int i=0;i<dt.Rows.Count;i++)
         {
            tnChild = new TreeNode(dt.Rows[i]["TITLE"].ToString(),dt.Rows[i]["ID"].ToString());
            string strSql ="SELECT COUNT(ID) FROM Base_News WHERE FI="+ tnChild.Value;
            if(DbHelper.ExecuteScalar(strSql,0)!= 0)BindChild(tnChild); //递归
            tn.ChildNodes.Add(tnChild);
         }
    }在page_load事件中调用BindNode("TreeVie控件ID")就可以了,数据库访问方法你得自己重新写。