TreeView与DataTable的绑定

前台页面:

[csharp]  view plain copy
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  4.   
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head runat="server">  
  7.     <title></title>  
  8. </head>  
  9. <body>  
  10.     <form id="form1" runat="server">  
  11.     <div>  
  12.         <asp:TreeView ID="TreeView1" runat="server" ShowLines="True">  
  13.         </asp:TreeView>  
  14.     </div>  
  15.     </form>  
  16. </body>  
  17. </html>  

后台:

[csharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. using System.Data;  
  8.   
  9. public partial class Default3 : System.Web.UI.Page  
  10. {  
  11.     protected void Page_Load(object sender, EventArgs e)  
  12.     {  
  13.         if (!IsPostBack)  
  14.         {  
  15.             BinTreeView();              //绑定树控件  
  16.             TreeView1.ExpandAll();      //展开所有节点  
  17.         }  
  18.     }  
  19.     /// <summary>  
  20.     /// 绑定树控件  
  21.     /// </summary>  
  22.     private void BinTreeView()  
  23.     {  
  24.         //得到测试用的 DataTable  
  25.         DataTable dt = Test_Table();  
  26.         //定义临时树节点  
  27.         TreeNode tmpNd;  
  28.         //从DataTable中得到所有父节点为null的DataRow形成的数组  
  29.         DataRow[] rows = dt.Select("parent_id is null");  
  30.         //遍历根节点数组  
  31.         foreach (DataRow row in rows)  
  32.         {  
  33.             tmpNd = new TreeNode();  
  34.             //给根节点赋值  
  35.             tmpNd.Value = row["id"].ToString();  
  36.             tmpNd.Text = row["name"].ToString();  
  37.             //将节点加入到树中  
  38.             TreeView1.Nodes.Add(tmpNd);  
  39.             //递归加入此根节点的子节点  
  40.             InitTreeView(tmpNd.ChildNodes, tmpNd.Value, dt);  
  41.         }  
  42.     }  
  43.     /// <summary>  
  44.     /// 递归加入节点的子节点  
  45.     /// </summary>  
  46.     /// <param name="treeNodeCollection">此节点的 ChildNodes </param>  
  47.     /// <param name="p">此节点的值(id)</param>  
  48.     /// <param name="dt">作为数据源的DataTable</param>  
  49.     private void InitTreeView(TreeNodeCollection treeNodeCollection, string p, DataTable dt)  
  50.     {  
  51.         TreeNode tmpNd;  
  52.         //取得以此节点为父节点的数据行  
  53.         DataRow[] rows = dt.Select("parent_id='" + p + "'");  
  54.         foreach (DataRow row in rows)  
  55.         {  
  56.             tmpNd = new TreeNode();  
  57.             //给根节点赋值  
  58.             tmpNd.Value = row["id"].ToString();  
  59.             tmpNd.Text = row["name"].ToString();  
  60.             //将节点加入到树中  
  61.             treeNodeCollection.Add(tmpNd);  
  62.             //递归加入此节点的子节点  
  63.             InitTreeView(tmpNd.ChildNodes, tmpNd.Value, dt);  
  64.         }  
  65.     }  
  66.   
  67.     /// <summary>  
  68.     /// 得到测试用的DataTable  
  69.     /// </summary>  
  70.     /// <returns></returns>  
  71.     private DataTable Test_Table()  
  72.     {  
  73.         DataTable dt = new DataTable();  
  74.         DataRow dr;  
  75.         dt.Columns.Add(new DataColumn("id"typeof(Guid)));//id列 类型guid  
  76.         dt.Columns.Add(new DataColumn("parent_id"typeof(Guid)));//父id列 类型guid  
  77.         dt.Columns.Add(new DataColumn("name"typeof(string)));//名称列 类型string  
  78.         //构造 公司 根节点  
  79.         dr = dt.NewRow();  
  80.         var node0 = dr[0] = Guid.NewGuid();  
  81.         dr[1] = DBNull.Value;  
  82.         dr[2] = "** 公司";  
  83.         dt.Rows.Add(dr);  
  84.         //构造 部门 节点  
  85.         string[] department = { "A部门""B部门""C部门" };  
  86.         for (int i = 0; i < department.Length; i++)  
  87.         {  
  88.             dr = dt.NewRow();  
  89.             var node1 = dr[0] = Guid.NewGuid();  
  90.             dr[1] = node0;//(部门节点)属于公司根节点  
  91.             dr[2] = department[i];  
  92.             dt.Rows.Add(dr);  
  93.             //构造 班组 节点  
  94.             for (int j = 1; j < 4; j++)  
  95.             {  
  96.                 dr = dt.NewRow();  
  97.                 dr[0] = Guid.NewGuid();  
  98.                 dr[1] = node1;  
  99.                 dr[2] = j + "班组";  
  100.                 dt.Rows.Add(dr);  
  101.             }  
  102.         }  
  103.         return dt;  
  104.     }  
  105. }  

更为优化的后台写法:

[html]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. using System.Data;  
  8.   
  9. public partial class Default3 : System.Web.UI.Page  
  10. {  
  11.     protected void Page_Load(object sender, EventArgs e)  
  12.     {  
  13.         if (!IsPostBack)  
  14.         {  
  15.             BindTreeView(Test_Table(), TreeView1.Nodes, null, "id", "parent_id", "name");              //绑定树控件  
  16.             TreeView1.CollapseAll();      //折叠所有节点  
  17.         }  
  18.     }  
  19.   
  20.     /// <summary>  
  21.     /// 递归绑定子节点  
  22.     /// </summary>  
  23.     /// <param name="dt">作为数据源的DataTable</param>  
  24.     /// <param name="tnc">该节点的子节点集合</param>  
  25.     /// <param name="pid_val">该节点的父节点值</param>  
  26.     /// <param name="id_Name">DataTable中id字段的名称</param>  
  27.     /// <param name="pid_Name">DataTable中父id字段的名称</param>  
  28.     /// <param name="text_Name">DataTable中name字段的名称</param>  
  29.     private void BindTreeView(DataTable dt, TreeNodeCollection tnc, string pid_val, string id_Name, string pid_Name, string text_Name)  
  30.     {  
  31.         DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据  
  32.         TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中  
  33.         //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件  
  34.         string filter = string.IsNullOrEmpty(pid_val) ? pid_Name + " is null" : string.Format(pid_Name + "='{0}'", pid_val);  
  35.         dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据  
  36.         foreach (DataRowView drv in dv)  
  37.         {  
  38.             tn = new TreeNode();//建立一个新节点  
  39.             tn.Value = drv[id_Name].ToString();//节点的Value值,一般为数据库的id值  
  40.             tn.Text = drv[text_Name].ToString();//节点的Text,节点的文本显示  
  41.             tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中  
  42.             BindTreeView(dt, tn.ChildNodes, tn.Value, id_Name, pid_Name, text_Name);//递归(反复调用这个方法,直到把数据取完为止)  
  43.         }  
  44.     }  
  45.     /// <summary>  
  46.     /// 得到测试用的DataTable  
  47.     /// </summary>  
  48.     /// <returns></returns>  
  49.     private DataTable Test_Table()  
  50.     {  
  51.         DataTable dt = new DataTable();  
  52.         DataRow dr;  
  53.         dt.Columns.Add(new DataColumn("id", typeof(Guid)));//id列 类型guid  
  54.         dt.Columns.Add(new DataColumn("parent_id", typeof(Guid)));//父id列 类型guid  
  55.         dt.Columns.Add(new DataColumn("name", typeof(string)));//名称列 类型string  
  56.         //构造 公司 根节点  
  57.         dr = dt.NewRow();  
  58.         var node0 = dr[0] = Guid.NewGuid();  
  59.         dr[1] = DBNull.Value;  
  60.         dr[2] = "** 公司";  
  61.         dt.Rows.Add(dr);  
  62.         //构造 部门 节点  
  63.         string[] department = { "A部门", "B部门", "C部门" };  
  64.         for (int i = 0; i < department.Length; i++)  
  65.         {  
  66.             dr = dt.NewRow();  
  67.             var node1 = dr[0] = Guid.NewGuid();  
  68.             dr[1] = node0;//(部门节点)属于公司根节点  
  69.             dr[2] = department[i];  
  70.             dt.Rows.Add(dr);  
  71.             //构造 班组 节点  
  72.             for (int j = 1; j < 4; j++)  
  73.             {  
  74.                 dr = dt.NewRow();  
  75.                 dr[0] = Guid.NewGuid();  
  76.                 dr[1] = node1;  
  77.                 dr[2] = j + "班组";  
  78.                 dt.Rows.Add(dr);  
  79.             }  
  80.         }  
  81.         return dt;  
  82.     }  
  83. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值