C#递归查询生成树节点

本文介绍使用C#通过两种方式实现树形数据加载的方法:一种是从数据库递归查询加载,另一种是从DataTable进行递归加载。这两种方法均适用于构建树形列表控件,并通过实例展示了具体的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     使用C#可以将所有数据一次性加载到DataTable或者每次递归都从新查询表,当然效率的高低不用我说大家都知道。源码并没有使用treegrid,而是使用TB.TreeGrid 树形列表 Asp.net自定义控件 http://www.cnblogs.com/sherwinzhu/archive/2008/10/01/TreeGrid.html

    1:递归查询从DB

 

    /// <summary>
    /// 递归查询数据,创建 TreeGridNode 节点
    /// </summary>
    /// <param name="nodes"></param>
    /// <param name="bo"></param>
    /// <param name="parentId"></param>
    private void CreateTreeViewRecursive(TreeGridNodeCollection nodes, WorkTypeBO bo, String parentId)
    {
       
        // 查询出节点数据
        IList<WorkTypeInfo> list = bo.GetWorkTypeByPid(parentId);

        TreeGridNode node;

        foreach (WorkTypeInfo wti in list)
        {
            node = new TreeGridNode("wti_id_" + wti.ID);

            //将节点加到树节点中
            nodes.Add(node);

            // 给节点赋值
            node.DataItem = wti;

            // 设置第一列序号
            wti.Number = ++rowIndex;

            // 展开节点
            node.Expand();

            // 递归创建子节点
            CreateTreeViewRecursive(node.ChildNodes,bo, wti.ID);

        }
    }


    /// <summary>
    /// 初始化 Tree 节点
    /// </summary>
    /// <param name="TreeGrid"></param>
    protected void InitTreeGridManual(TreeGrid tg)
    {

        WorkTypeBO bo = new WorkTypeBO();

        //0 表示第一级根节点菜单
        CreateTreeViewRecursive(tg.Nodes, bo, "0");

        tg.ManualDataBind();
    }

 

    2.递归查询从DataTable

    /// <summary>
    /// 递归查询数据,创建 TreeGridNode 节点
    /// </summary>
    /// <param name="nodes"></param>
    /// <param name="bo"></param>
    /// <param name="parentId"></param>
    private void CreateTreeViewRecursive(TreeGridNodeCollection nodes, DataTable dataSource, String parentId)
    {
       
        string fliter = String.Format("pid={0}", parentId);
        // 查询出节点数据
        DataRow[] drArr = dataSource.Select(fliter);
        dataSource.DefaultView.Sort = "wd_order desc";

        TreeGridNode node;

        foreach (DataRow dr in drArr)
        {

            WorkTypeInfo wti = this.getNodeObject(dr);

            node = new TreeGridNode("wti_id_" + wti.ID);

            //将节点加到树节点中
            nodes.Add(node);

            // 给节点赋值
            node.DataItem = wti;

            // 设置第一列序号
            wti.Number = ++rowIndex;

            // 展开节点
            node.Expand();

            // 递归创建子节点
            CreateTreeViewRecursive(node.ChildNodes, dataSource, wti.ID);

            // 移除已添加行,提高性能
            dataSource.Rows.Remove(dr);

        }
    }

    /// <summary>
    /// 初始化 Tree 节点
    /// </summary>
    /// <param name="TreeGrid"></param>
    protected void InitTreeGridManual(TreeGrid tg)
    {

        WorkTypeBO bo = new WorkTypeBO();
        DataTable dt = bo.GetAllWorkTypesByDataTable();
        //0 表示第一级根节点菜单
        CreateTreeViewRecursive(tg.Nodes, dt, "0");
        tg.ManualDataBind();
    }

 

PS1:

public IList<WorkTypeInfo> GetWorkTypeByPid(String pid)
        {
            string sqlCommand = WORKDALIYSQL + " where  wd_pid=@pid order by wd_order ";
            DbParameter dbParam = new MySqlParameter("@pid", DbType.Int32);
            dbParam.Value = pid;

            IList<WorkTypeInfo> workTypes = new List<WorkTypeInfo>();
            using (IDataReader dr = DBHelper.ExecuteReader(sqlCommand, dbParam))  //執行查詢,返回reader
            {
                WorkTypeInfo obj = null;
                while (dr.Read())
                {
                    obj = this.getDB2OBJ(dr);
                    workTypes.Add(obj);
                }
            }
            return workTypes;
        }

 

   PS2:

   public DataTable GetAllWorkTypesByDataTable()
        {
            string sqlCommand = WORKDALIYSQL;
            DataSet workTypes = DBHelper.ExecuteDataSet(sqlCommand);
            return workTypes.Tables[0];
        }

 

   static String WORKDALIYSQL = "select wd_id,wd_pid,wd_tagname,wd_typename,wp_typedesc,wp_worktype,wp_deptno,wp_visable,createdatetime,wd_order from da_workdailys ";

 

//设定生成树的原始数据 void getdatable() { tblDatas.Columns.Add("groupid", Type.GetType("System.String")); tblDatas.Columns.Add("groupname", Type.GetType("System.String")); tblDatas.Columns.Add("parentid", Type.GetType("System.String")); tblDatas.Rows.Add(new object[] { "1", "机关", "0" }); tblDatas.Rows.Add(new object[] { "2", "学院", "0" }); tblDatas.Rows.Add(new object[] { "3", "教学管理中心", "1" }); tblDatas.Rows.Add(new object[] { "4", "校园管理中心", "1" }); tblDatas.Rows.Add(new object[] { "5", "数据中心", "3" }); tblDatas.Rows.Add(new object[] { "6", "信息中心", "3" }); tblDatas.Rows.Add(new object[] { "7", "一卡通", "4" }); tblDatas.Rows.Add(new object[] { "8", "保卫处", "4" }); tblDatas.Rows.Add(new object[] { "9", "信工系", "2" }); tblDatas.Rows.Add(new object[] { "10", "艺术系", "2" }); dataGridView1.DataSource = tblDatas; } //递归生成树函数 public void AddTree(int ParentID, TreeNode pNode) { DataTable dt = new DataTable(); dt = tblDatas; DataView dvTree = new DataView(dt); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "parentid = " + ParentID; foreach (DataRowView Row in dvTree) { TreeNode Node = new TreeNode(); if (pNode == null) { //添加根节点 Node.Text = Row["groupname"].ToString(); treeView1.Nodes.Add(Node); AddTree(Int32.Parse(Row["groupid"].ToString()), Node); //再次递归 } else { //添加当前节点的子节点 Node.Text = Row["groupname"].ToString(); pNode.Nodes.Add(Node); AddTree(Int32.Parse(Row["groupid"].ToString()), Node); //再次递归 } } } //调用递归函数在treeView1里面显示给出数据的树形图 private void button1_Click(object sender, EventArgs e) { treeView1.Nodes.Clear(); AddTree(0, (TreeNode)null); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值