帮忙写段代码
数据库是这样的,表名:Company
字段:ID、parentId、name
根节点的index我设为0
表中数据是这样的:
ID     parentId     name
1         0         综合
2         0         财务
3         1         考勤
4         2         发票
5         3         迟到
6         4         签字
          ……
          ……
具体有多少个子节点不确定
在TreeView中显示的效果如下:部门
--综合
----考勤
------迟到
--财务
----发票
------签字    ……
至于有多少级节点还不清楚我只知道这个要用递归,但不知道具体怎么写,哪位根据这个例子帮写段代码参考下,谢谢

解决方案 »

  1.   

    public void FillData()
    {
    itemsDv.Sort=pidMember;
    FillData(this.tvItems.Nodes,rootId);
    } private void FillData(TreeNodeCollection nodes,string nodeId)
    {
    if(itemsDv.Sort!=pidMember)itemsDv.Sort=pidMember;
    DataRowView[] curDrvs=itemsDv.FindRows(nodeId);
    foreach(DataRowView curDrv in curDrvs)
    {
    TreeNode nd=new TreeNode();
    nd.Text=curDrv[displayMember].ToString();
    int idxChild=itemsDv.Find(curDrv[idMember].ToString());
    if(idxChild>=0)
    {
    nd.ImageIndex=0;
    nd.SelectedImageIndex=0;
    FillData(nd.Nodes,curDrv[idMember].ToString());
    }
    else
    {
    if(idxChild>=0)
    {
    nd.ImageIndex=0;
    nd.SelectedImageIndex=0;
    }
    else
    {
    nd.ImageIndex=2;
    nd.SelectedImageIndex=2;
    }
    }
    nodes.Add(nd);
    }
    }
      

  2.   


           DataSet dsdata=new DataSet();
            private void button3_Click(object sender, EventArgs e)
            {
                string con = "server=localhost;Integrated Security=SSPI;database=Common";
                string sqlstr = "Select ID  ,   parentId  ,   name  from Company ";
                SqlConnection connect = new SqlConnection(con);
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = sqlstr;
                cmd.Connection = connect;          
                SqlDataAdapter dap = new SqlDataAdapter();
                dap.SelectCommand = cmd;
                dap.Fill(dsdata);            TreeNode tmnode = new TreeNode("部门");
                this.treeView1.Nodes.Add(tmnode);
                CreatTreeView2(tmnode, 0);
            }        private void CreatTreeView2(TreeNode parentNode,int parentid)
            {
                DataRow[] drs = dsdata.Tables[0].Select("parentId= " + parentid.ToString().Trim());            foreach (DataRow dr in drs)
                {
                    TreeNode tmnode = new TreeNode(dr["name"].ToString().Trim());
                    parentNode.Nodes.Add(tmnode);
                    CreatTreeView2(tmnode, Convert.ToInt32(dr["ID"]));
                }
            }
      

  3.   

    楼上正解。也可:
            private void CreatTreeView2(TreeNode parentNode)
            {
                DataRow[] drs = dsdata.Tables[0].Select("parentId= " + parentNode.Name);
                foreach (DataRow dr in drs)
                {
                    TreeNode tmnode = parentNode.Nodes.Add(dr["ID"].ToString, dr["name"]);
                    CreatTreeView2(tmnode));
                }
            }
      

  4.   

    关于从数据表加在数据到TreeView,这个也是比较经典的问题,以下是我的一个软件中实现方式,类似于楼主的场景
    数据表主要结构如下:
    表名为: [dbo].[Category]
    主要的字段列:
    [CategoryID] [int] IDENTITY(1,1) NOT NULL,
    [CategoryName] [nvarchar](32) NOT NULL,
    [CategoryType] [int] NOT NULL,
    [ParentID] [int] NULL,针对数据的加载给出两种实现方式,递归和非递归。以下是C# 代码,对于数据的获取使用其他类,不过最终是查询结果是DataTable,因此看过程中不需要关心。
    1.递归方式//递归调用函数
            private static void LoadCategoryDataToTreeView()
            {
                this.treeView1.BeginUpdate();
                //this.treeView1.Nodes.Clear();
                //生成根节点
                CategoryTreeNode rootNode = new CategoryTreeNode(ApplicationGlobal.Instance.ApplicationSettings.CategoryRootNodeName, 0, 0);//技巧分类
                rootNode.CategoryData = null;
                this.treeView1.Nodes.Add(rootNode);
                //添加一级分类
                foreach (DataSetSR.CategoriesRow cateRow in DataSettings.Instance.Data.Categories.Select("ParentId = 0"))
                {
                    CategoryTreeNode tnode = new CategoryTreeNode(cateRow.CategoryName, 1, 2);
                    tnode.CategoryData = cateRow;
                    rootNode.Nodes.Add(tnode);                foreach (DataSetSR.CategoriesRow subcateRow in DataSettings.Instance.Data.Categories.Select("ParentId = " + cateRow.CategoryId))
                    {
                        BindSubCategoryTreeNode(tnode, subcateRow);
                    }
                }
                this.treeView1.ExpandAll();
                this.treeView1.EndUpdate();
            }
            ////递归执行函数
            private static void BindSubCategoryTreeNode(TreeNode treeNode, DataSetSR.CategoriesRow cateRow)
            {
                CategoryTreeNode tnode = new CategoryTreeNode(cateRow.CategoryName, 1, 2);
                tnode.CategoryData = cateRow;
                treeNode.Nodes.Add(tnode);
                foreach (DataSetSR.CategoriesRow subcateRow in DataSettings.Instance.Data.Categories.Select("ParentId = " + cateRow.CategoryId))
                {
                    BindSubCategoryTreeNode(tnode, subcateRow);
                }
            }
    2.非递归方式//非递归加载数据,Stack实现
            public static void LoadCategoryData(TreeView treeView/*,DataTable dt*/)
            {
                DataTable dt = new DataTable();
                DocumentController.GetInstance().FillCategories(dt);            Stack<TreeNode> stack = new Stack<TreeNode>();            treeView.BeginUpdate();
                //add rootNode
                TreeNode rootNode = new TreeNode("文档管理", 0, 0);
                treeView.Nodes.Add(rootNode);
                //add childNodes            
                //TreeNode parentNode = rootNode;
                //添加一级分类
                foreach (DataRow cateRow in dt.Select("ParentID IS NULL"))
                {
                    Category category = new Category(cateRow);
                    TreeNode node = new TreeNode(category.CategoryName, 1, 2);
                    node.Tag = category;
                    rootNode.Nodes.Add(node);
                    stack.Push(node);
                }
                while (stack.Count > 0)//添加一级分类下面的子分类
                {
                    TreeNode parentNode = stack.Pop();
                    int id = ((Category)parentNode.Tag).CategoryID;
                    foreach (DataRow cateRow in dt.Select("ParentID = " + id.ToString()))
                    {
                        Category category = new Category(cateRow);
                        TreeNode childNode = new TreeNode(category.CategoryName, 1, 2);
                        childNode.Tag = category;
                        parentNode.Nodes.Add(childNode);
                        stack.Push(childNode);
                    }
                }            treeView.Nodes[0].Expand();
                treeView.EndUpdate();
            }