TreeView与DataTable的绑定

前台页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TreeView ID="TreeView1" runat="server" ShowLines="True">
        </asp:TreeView>
    </div>
    </form>
</body>
</html>

后台:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BinTreeView();              //绑定树控件
            TreeView1.ExpandAll();      //展开所有节点
        }
    }
    /// <summary>
    /// 绑定树控件
    /// </summary>
    private void BinTreeView()
    {
        //得到测试用的 DataTable
        DataTable dt = Test_Table();
        //定义临时树节点
        TreeNode tmpNd;
        //从DataTable中得到所有父节点为null的DataRow形成的数组
        DataRow[] rows = dt.Select("parent_id is null");
        //遍历根节点数组
        foreach (DataRow row in rows)
        {
            tmpNd = new TreeNode();
            //给根节点赋值
            tmpNd.Value = row["id"].ToString();
            tmpNd.Text = row["name"].ToString();
            //将节点加入到树中
            TreeView1.Nodes.Add(tmpNd);
            //递归加入此根节点的子节点
            InitTreeView(tmpNd.ChildNodes, tmpNd.Value, dt);
        }
    }
    /// <summary>
    /// 递归加入节点的子节点
    /// </summary>
    /// <param name="treeNodeCollection">此节点的 ChildNodes </param>
    /// <param name="p">此节点的值(id)</param>
    /// <param name="dt">作为数据源的DataTable</param>
    private void InitTreeView(TreeNodeCollection treeNodeCollection, string p, DataTable dt)
    {
        TreeNode tmpNd;
        //取得以此节点为父节点的数据行
        DataRow[] rows = dt.Select("parent_id='" + p + "'");
        foreach (DataRow row in rows)
        {
            tmpNd = new TreeNode();
            //给根节点赋值
            tmpNd.Value = row["id"].ToString();
            tmpNd.Text = row["name"].ToString();
            //将节点加入到树中
            treeNodeCollection.Add(tmpNd);
            //递归加入此节点的子节点
            InitTreeView(tmpNd.ChildNodes, tmpNd.Value, dt);
        }
    }

    /// <summary>
    /// 得到测试用的DataTable
    /// </summary>
    /// <returns></returns>
    private DataTable Test_Table()
    {
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("id", typeof(Guid)));//id列 类型guid
        dt.Columns.Add(new DataColumn("parent_id", typeof(Guid)));//父id列 类型guid
        dt.Columns.Add(new DataColumn("name", typeof(string)));//名称列 类型string
        //构造 公司 根节点
        dr = dt.NewRow();
        var node0 = dr[0] = Guid.NewGuid();
        dr[1] = DBNull.Value;
        dr[2] = "** 公司";
        dt.Rows.Add(dr);
        //构造 部门 节点
        string[] department = { "A部门", "B部门", "C部门" };
        for (int i = 0; i < department.Length; i++)
        {
            dr = dt.NewRow();
            var node1 = dr[0] = Guid.NewGuid();
            dr[1] = node0;//(部门节点)属于公司根节点
            dr[2] = department[i];
            dt.Rows.Add(dr);
            //构造 班组 节点
            for (int j = 1; j < 4; j++)
            {
                dr = dt.NewRow();
                dr[0] = Guid.NewGuid();
                dr[1] = node1;
                dr[2] = j + "班组";
                dt.Rows.Add(dr);
            }
        }
        return dt;
    }
}

更为优化的后台写法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindTreeView(Test_Table(), TreeView1.Nodes, null, "id", "parent_id", "name");              //绑定树控件
            TreeView1.CollapseAll();      //折叠所有节点
        }
    }

    /// <summary>
    /// 递归绑定子节点
    /// </summary>
    /// <param name="dt">作为数据源的DataTable</param>
    /// <param name="tnc">该节点的子节点集合</param>
    /// <param name="pid_val">该节点的父节点值</param>
    /// <param name="id_Name">DataTable中id字段的名称</param>
    /// <param name="pid_Name">DataTable中父id字段的名称</param>
    /// <param name="text_Name">DataTable中name字段的名称</param>
    private void BindTreeView(DataTable dt, TreeNodeCollection tnc, string pid_val, string id_Name, string pid_Name, string text_Name)
    {
        DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据
        TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中
        //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件
        string filter = string.IsNullOrEmpty(pid_val) ? pid_Name + " is null" : string.Format(pid_Name + "='{0}'", pid_val);
        dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据
        foreach (DataRowView drv in dv)
        {
            tn = new TreeNode();//建立一个新节点
            tn.Value = drv[id_Name].ToString();//节点的Value值,一般为数据库的id值
            tn.Text = drv[text_Name].ToString();//节点的Text,节点的文本显示
            tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中
            BindTreeView(dt, tn.ChildNodes, tn.Value, id_Name, pid_Name, text_Name);//递归(反复调用这个方法,直到把数据取完为止)
        }
    }
    /// <summary>
    /// 得到测试用的DataTable
    /// </summary>
    /// <returns></returns>
    private DataTable Test_Table()
    {
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("id", typeof(Guid)));//id列 类型guid
        dt.Columns.Add(new DataColumn("parent_id", typeof(Guid)));//父id列 类型guid
        dt.Columns.Add(new DataColumn("name", typeof(string)));//名称列 类型string
        //构造 公司 根节点
        dr = dt.NewRow();
        var node0 = dr[0] = Guid.NewGuid();
        dr[1] = DBNull.Value;
        dr[2] = "** 公司";
        dt.Rows.Add(dr);
        //构造 部门 节点
        string[] department = { "A部门", "B部门", "C部门" };
        for (int i = 0; i < department.Length; i++)
        {
            dr = dt.NewRow();
            var node1 = dr[0] = Guid.NewGuid();
            dr[1] = node0;//(部门节点)属于公司根节点
            dr[2] = department[i];
            dt.Rows.Add(dr);
            //构造 班组 节点
            for (int j = 1; j < 4; j++)
            {
                dr = dt.NewRow();
                dr[0] = Guid.NewGuid();
                dr[1] = node1;
                dr[2] = j + "班组";
                dt.Rows.Add(dr);
            }
        }
        return dt;
    }
}

参考文章: 点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值