C# Web控件与数据感应之 TreeView 类

打印 上一主题 下一主题

主题 901|帖子 901|积分 2703

 
目录
关于 TreeView
一些区别
预备数据源
范例运行环境
一些实用方法
获取数据举行呈现
​根据ID设置节点
获取全部结点的索引 
小结


关于 TreeView

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,本文将继续先容与数据库提取数据并捆绑到 TreeView 类控件。在我的前期文章《C# DataSet结合FlyTreeView显示树状模型数据》,对于 FlyTreeView 已做过先容,本文则先容C# 实现 Microsoft.Web.UI.WebControls.TreeView 和 System.Web.UI.WebControls.TreeView 的一些实用方法。
一些区别

Microsoft.Web.UI.WebControls.TreeView 、 System.Web.UI.WebControls.TreeView 和NineRays.WebControls.FlyTreeView 在利用和呈现上大同小异,关键的区别在于 FlyTreeView不是免费的,纵然利用破解版本可能也存在部门题目,这个在利用中必要注意。而Microsoft.Web.UI.WebControls.TreeView 和 System.Web.UI.WebControls.TreeView 是微软提供的内置控件,前者是 TreeView 的早期版本,现在基本以 System.Web.UI.WebControls.TreeView 为准。本文将以 Microsoft.Web.UI.WebControls.TreeView 为举例。
预备数据源

我们在 MS SQL Server 创建 pub_area(地区表),其结构如下表:
序号字段名范例说明1acodenvarchar(10)地区代码,唯一键2anamenvarchar(50)地区名称3parent_acodenvarchar(10)父项所属地区代码 实行如下 创建表的 SQL 语句:
  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. CREATE TABLE [dbo].[pub_area](
  6.         [acode] [nvarchar](10) NOT NULL,
  7.         [aname] [nvarchar](50) NOT NULL,
  8.         [parent_acode] [nvarchar](10) NULL,
  9. CONSTRAINT [IX_pub_area] UNIQUE NONCLUSTERED
  10. (
  11.         [acode] ASC
  12. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  13. ) ON [PRIMARY]
  14. GO
复制代码
实行如下SQL语句,创建一些数据:
  1. insert into pub_area(acode,aname,parent_acode) values('01','天津市','')
  2. insert into pub_area(acode,aname,parent_acode) values('0101','南开区','01')
  3. insert into pub_area(acode,aname,parent_acode) values('010101','学府街道','0101')
  4. insert into pub_area(acode,aname,parent_acode) values('010102','万兴街道','0101')
复制代码
通过查询分析器,实行查询SQL语句,显示如下图:


最后我们将数据添补到 DataSet 即可,具体操纵可参考我的文章《C# 利用IDbDataAdapter / IDataReader 实现通用数据集获取》 


范例运行环境

操纵系统: Windows Server 2019 DataCenter
数据库:Microsoft SQL Server 2016
.net版本: .netFramework4.0 或以上
开发工具:VS2019  C#
一些实用方法

获取数据举行呈现

simpletreeview方法主要是通过DataSet数据源举行提取呈现的TreeView控件上,方法返回 int 范例,表示成功返回当前节点的节点数,其参数设置见下表:
序号参数名范例说明1tv Microsoft.Web.UI.WebControls.
TreeNodeCollection
传入的TreeView的当前结点集合对象2dsDataSet数据集对象,默认只取Tables[0]3keystring数据表的唯一标识字段名4parentkeystring数据表的父结点字段名5disstring数据表的显示名称字段名6keytypestring标识范例,这是我们自定的规范,比如CID(字符)、ID(数值)固定名称的处置惩罚方式,默认处置惩罚方式对key或parentKey举行字符串过滤处置惩罚7initvaluestring是否指定一个初始值8firstlevelbool是否指遍历一级,如果为true,则不在举行递归9initByKeybool初始值利用哪个关键字段,false利用父节点,true利用唯一标识,默认为false 实当代码如下:
  1.                 public int simpletreeview(Microsoft.Web.UI.WebControls.TreeNodeCollection tv,DataSet ds,string key,string parentkey,string dis,string keytype,string initvalue,bool firstlevel,bool initByKey)
  2.                 {
  3.                         int rv=0;
  4.                         DataView dv=new DataView();
  5.                         dv.Table=ds.Tables[0];
  6.             Microsoft.Web.UI.WebControls.TreeNode tmpNd;
  7.                         if((keytype=="uniqueidentifier")&&(initvalue==""))
  8.                         {
  9.                                 dv.RowFilter=" "+(initByKey==false?parentkey:key)+" is null ";
  10.                         }
  11.                         else
  12.                         {
  13.                                 dv.RowFilter="isnull("+(initByKey==false?parentkey:key)+",'')='"+initvalue+"'";
  14.                         }
  15.                         rv=dv.Count;
  16.                         foreach(DataRowView drv in dv)
  17.                         {
  18.                 tmpNd = new Microsoft.Web.UI.WebControls.TreeNode();
  19.                                 tmpNd.ID=drv[key].ToString();
  20.                                 tmpNd.Text=drv[dis].ToString();
  21.                                 //    tmpNd.ImageUrl="../images/"+drv["Caption"].ToString();
  22.                                 //    tmpNd.NavigateUrl="../"+drv["Caption"].ToString();
  23.                                 tv.Add(tmpNd);
  24.                                 if(!firstlevel)
  25.                                 simpletreeview(tmpNd.Nodes,ds,key,parentkey,dis,keytype,tmpNd.ID,firstlevel,false);
  26.                         }
  27.                         return rv;
  28.                 }
复制代码
调用示例如下代码:
  1. <%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="FALSE" %>
  2. <%@ Register TagPrefix="codn" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls"%>
  3. <%@ Import Namespace="System.Data" %>
  4. <script language="C#" runat="server">
  5.     void Page_Load(Object sender, EventArgs e)
  6.     {
  7.         if (Page.IsPostBack) { return; }
  8.         object rvvv=GetDataSet("select acode,aname,parent_acode from pub_area", null);
  9.         DataSet _ds = rvvv as DataSet;
  10.         int rvvv_count = simpletreeview(tv.Nodes, _ds, "acode", "parent_acode", "aname", "uniqueidentifier", "",false,false);
  11. //        Response.Write(rvvv_count);
  12.         return;
  13.     }
  14. </script>
  15. <html>
  16. <head>
  17.     <meta charset="UTF-8">
  18.     <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=yes"/>
  19.     <title></title>
  20.     </style>
  21. </head>
  22. <body>
  23. <form runat="server">
  24. <div style=" margin-top:50px;margin-left:50px">
  25.        <codn:TreeView ID="tv" runat="server" Height="300" ShowLines="true"  Width="500" AutoPostBack="false" ExpandLevel="3" BackColor="White" style="font-family: 微软雅黑"
  26.                                 EnableTheming="True"  BorderColor="#003300" BorderStyle="Solid" BorderWidth="1px">
  27.         </codn:TreeView>
  28. </div>
  29. </form>
  30. </body>
  31. <script type="text/javascript">
  32. </script>
  33. </html>
复制代码
成功后如下图显示:
根据ID设置节点


SetTreeViewById 方法对当前给定集合举行ID查找,并返回结点ID和选中当前结点,其参数说明见下表:
序号参数名范例说明1tv Microsoft.Web.UI.WebControls.
TreeNodeCollection
传入的TreeView的当前结点集合对象2idstring要查找的ID 实当代码如下:
  1. public string SetTreeViewById(Microsoft.Web.UI.WebControls.TreeNodeCollection tv,string id)
  2.                 {
  3.                         string findid="";
  4.                         for(int i=0;i<tv.Count;i++)
  5.                         {
  6.                                 if(tv[i].ID==id)
  7.                                 {
  8.                                         string index1=tv[i].GetNodeIndex();//取得index
  9.                                         object tn=tv[i];
  10.                                         while(tn.GetType()==typeof(Microsoft.Web.UI.WebControls.TreeNode))
  11.                                         {
  12.                         tn = ((Microsoft.Web.UI.WebControls.TreeNode)tn).Parent;
  13.                                         }
  14.                                         if(tn.GetType()==typeof(Microsoft.Web.UI.WebControls.TreeView))
  15.                                         {
  16.                         ((Microsoft.Web.UI.WebControls.TreeView)tn).SelectedNodeIndex = index1;
  17.                                         }
  18.                                         findid=i.ToString();
  19.                                         break;
  20.                                 }               
  21.                                 SetTreeViewById(tv[i].Nodes,id);
  22.                         }
  23.                         return findid;
  24. }
复制代码
调用代码如下,本示例要查找南开区(ID为0101)的节点并选中:
  1. SetTreeViewById(tv.Nodes, "0101");
复制代码
成功后如下图:

获取全部结点的索引 

GetTreeViewAllNodes 方法获取当前给定集合的全部结点的索引,并存储到指定的ArrayList当中,其参数说明见下表:
序号参数名范例说明1tv Microsoft.Web.UI.WebControls.
TreeNodeCollection
传入的TreeView的当前结点集合对象2rv2ArrayList要存储的 ArrayList 实当代码如下:
  1. public void GetTreeViewAllNodes(Microsoft.Web.UI.WebControls.TreeNodeCollection tv,ArrayList rv2)
  2. {
  3.         for(int i=0;i<tv.Count;i++)
  4.         {
  5.                 rv2.Add(tv[i].GetNodeIndex());
  6.                 GetTreeViewAllNodes(tv[i].Nodes,rv2);
  7.         }
  8. }
复制代码
调用示例如下,获取南开区的全部街道结点的索引:
  1. ArrayList rv2 = new ArrayList();
  2. GetTreeViewAllNodes(tv.Nodes, rv2);
  3. Response.Write(rv2.Count);
复制代码
小结

1、利用控件前必要下载dll并放置到您的网站bin目录下,可以到我的资源举行下载,链接如下:
https://download.csdn.net/download/michaelline/89267878
2、在 VS 中开发我们必要在 IDE环境办理方案中添加此 dll 并引用,如果利用 System.Web.UI.WebControls.TreeView 则引用 System.Web,如下图:


3、提供一个后端辅助方法 simplebomlist,该方法可以直接从 DataSet 中获得给定查找值的全部下级的关键值信息,并放置到 ArrayList 中。
其参数说明见下表:
序号参数名范例说明1tvTreeNodeCollection要遍历的TreeView集合2keystring关键字段名3parentkeystring父项关键字段名4initvaluestring要查找的关键字段值5rv2ArrayList要存储的 ArrayList 变量 方法代码如下:
  1. public void simplebomlist(DataSet ds,string key,string parentkey,string initvalue,ArrayList rv2)
  2. {
  3.         DataView dv=new DataView();
  4.         dv.Table=ds.Tables[0];
  5.         dv.RowFilter="isnull("+parentkey+",'')='"+initvalue+"'";
  6.         foreach(DataRowView drv in dv)
  7.         {
  8.                 rv2.Add(drv[key].ToString());
  9.                 simplebomlist(ds,key,parentkey,drv[key].ToString(),rv2);
  10.         }
  11. }
复制代码
方法会在指定的 ArrayList 里存储 关键字段 的 Value 值 。
关于 System.Web.UI.WebControls.TreeView 的利用方法和 Microsoft.Web.UI.WebControls.TreeView 基本一样,但其一些方法属性会有变革 ,我们会在后续文章中先容。
本文是仅从示例先容TreeView的利用方法,发起后期利用 System.Web.UI.WebControls.TreeView 举行操纵更稳妥一些,具体先容和用法可参照如下链接:
https://learn.microsoft.com/zh-cn/dotnet/api/system.web.ui.webcontrols.treeview?view=netframework-4.8.1&redirectedfrom=MSDN
感谢您的阅读,希望本文能够对您有所帮助。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表