前台页面:
- <%@ 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;
- }
- }