在数据库里有这样的一张表:tree,是这样定义的
id     pid   name
1       1     aa
1       11    bb
1       12    cc
12      121   dd
12      122   ee
要生成
aa
  bb
  cc
    dd
    ee
这样的一个树提供的思路啊!最好有源代码

解决方案 »

  1.   

            public void bindtreeview(TreeView treeview, bool isExpand, string sSelectedData)
            {
                DataTable dataTable = GetDir().Tables[0];
                treeview.Nodes.Clear();
                DataRow[] rowlist = dataTable.Select("FarentID='1'");
                if (rowlist.Length <= 0)
                    return;
                //创建根接点
                TreeNode rootnode = new TreeNode();
                //设置根接点属性
                rootnode.Text = rowlist[0]["name"].ToString();
                //设置根接点的key值
                rootnode.Value = rowlist[0]["DirID"].ToString();
                rootnode.Expanded = isExpand;
                rootnode.Selected = true;
                //添加根接点
                treeview.Nodes.Add(rootnode);
                //创建其他接点
                CreateChildNode(rootnode, dataTable, isExpand, sSelectedData);
            }        private void CreateChildNode(TreeNode parentNode, DataTable dataTable, bool isExpanded, string sSelectdeData)
            {
                DataRow[] rowlist = dataTable.Select("FarentID='" + parentNode.Value + "'");
                foreach (DataRow row in rowlist)
                {
                    //创建新接点
                    TreeNode node = new TreeNode();
                    //设置接点属性
                    node.Text = row["name"].ToString();
                    node.Value = row["id"].ToString();
                    node.Expanded = isExpanded;
                    if (node.Value == sSelectdeData)
                    {
                        node.Selected = true;
                    }
                    parentNode.ChildNodes.Add(node);
                    //递归调用 ,创建其他接点
                    CreateChildNode(node, dataTable, isExpanded, sSelectdeData);
                }
            }
      

  2.   

    [★] VS2005[C#] B/S C/S 运用递归 动态绑定树 
    =========
    今天无意当中翻到了 以前用VS2005 开发的 B/S 动态绑定树的例子..
    还是自己的笔记好.一下子 就看懂了..马上又开发了一个 C/S 结构的供大家参考..
    前面发过 2 篇关于树的例子..资源管理器还不错..另外一篇就差了..
    但是对初学者来说 非常好理解..另外 B/S 树会刷新..C/S 树也会刷新...为了不让它刷新..添加,修改.删除 节点的时候..树和数据库是独立的..,
    就是不用先操作数据库,然后重新绑定..
    2者独立操作. 运用BeginUpdate() he EdnUpdate() 防止树刷新...递归绑定树
    这种方法只适合 一个表总的某一列引用自己的主键的情况..
    C/S:
     //创建根节点
        public void BindCategoryTreeVew(TreeView treeView, bool isExpanded, string sSelectedData)
        {
            //将获取的数据转换为 一个DataTable
            DataTable dt=GetCategorys().Tables[0];
            treeView.Nodes.Clear();//清空 树的所有节点
            //获取与排序顺序中的筛选器以及指定的状态相匹配的所有System.Data.DataRow 数组
            DataRow []rowlist=dt.Select("ParentID='-1'");
            if (rowlist.Length <= 0) return;
            //创建跟节点
            TreeNode rootNode = new TreeNode();
            //设置根节点的属性
            rootNode.Text = rowlist[0]["Desn"].ToString();
            //设置根节点的值
            rootNode.Text = rowlist[0]["CategoryID"].ToString();
            rootNode.Expanded = isExpanded;
            rootNode.Selected = true;
            //添加跟节点
            CategoryView.Nodes.Add(rootNode);
            CreateChildNode(rootNode, dt, isExpanded, sSelectedData);     }
        private void CreateChildNode(TreeNode parentNode, DataTable dt, bool isExpanded, string sSelecedData)
        {
            //选择数据,添加排序表达市
            DataRow [] rowList = dt.Select("ParentID=" + Convert.ToInt32(parentNode.Value));
            foreach (DataRow row in rowList)
            {
                //创建一个新的节点了
                TreeNode node = new TreeNode();
                node.Text = row["Desn"].ToString();
                node.Value = row["CategoryID"].ToString();
                node.Expanded = isExpanded;
                if (node.Value == sSelecedData)
                {
                    node.Selected = true;
                }
                parentNode.ChildNodes.Add(node);
                //递归调用,创建其他节点
                CreateChildNode(node,dt,isExpanded,sSelecedData);
            }
        }
    B/S:
      //创建根节点
        public void BindCategoryTreeVew(TreeView treeView, bool isExpanded, string sSelectedData)
        {
            //将获取的数据转换为 一个DataTable
            DataTable dt=GetCategorys().Tables[0];
            treeView.Nodes.Clear();//清空 树的所有节点
            //获取与排序顺序中的筛选器以及指定的状态相匹配的所有System.Data.DataRow 数组
            DataRow []rowlist=dt.Select("ParentID='-1'");
            if (rowlist.Length <= 0) return;
            //创建跟节点
            TreeNode rootNode = new TreeNode();
            //设置根节点的属性
            rootNode.Text = rowlist[0]["Desn"].ToString();
            //设置根节点的值
            rootNode.value = rowlist[0]["CategoryID"].ToString();
            rootNode.Expanded = isExpanded;
            rootNode.Selected = true;
            //添加跟节点
            CategoryView.Nodes.Add(rootNode);
            CreateChildNode(rootNode, dt, isExpanded, sSelectedData);     }
        private void CreateChildNode(TreeNode parentNode, DataTable dt, bool isExpanded, string sSelecedData)
        {
            //选择数据,添加排序表达市
            DataRow [] rowList = dt.Select("ParentID=" + Convert.ToInt32(parentNode.Value));
            foreach (DataRow row in rowList)
            {
                //创建一个新的节点了
                TreeNode node = new TreeNode();
                node.Text = row["Desn"].ToString();
                node.Value = row["CategoryID"].ToString();
                node.Expanded = isExpanded;
                if (node.Value == sSelecedData)
                {
                    node.Selected = true;
                }
                parentNode.ChildNodes.Add(node);
                //递归调用,创建其他节点
                CreateChildNode(node,dt,isExpanded,sSelecedData);
            }
        }