目录
关于内置 TreeView
两者的区别
准备数据源
范例运行环境
一些实用方法
获取数据进行呈现
获取所有的结点
小结
关于内置 TreeView
数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,在我的前期文章《C# Web控件与数据感应之 TreeView 类》,对于 Microsoft.Web.UI.WebControls.TreeView 已做了详细介绍,本文则继续介绍 C# 实现 System.Web.UI.WebControls.TreeView 的一些实用方法。
两者的区别
Microsoft.Web.UI.WebControls.TreeView 属于微软的过去时控件,现在则升级为内置的 System.Web.UI.WebControls 集合,System.Web.UI.WebControls.TreeView 也已正式成为内置控件,并且属性方法均有一些变化。
准备数据源
我们在 MS SQL Server 创建 pub_area(区域表),其结构如下表:
序号 | 字段名 | 类型 | 说明 |
---|---|---|---|
1 | acode | nvarchar(10) | 区域代码,唯一键 |
2 | aname | nvarchar(50) | 区域名称 |
3 | parent_acode | nvarchar(10) | 父项所属区域代码 |
执行如下 创建表的 SQL 语句:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[pub_area]( [acode] [nvarchar](10) NOT NULL, [aname] [nvarchar](50) NOT NULL, [parent_acode] [nvarchar](10) NULL, CONSTRAINT [IX_pub_area] UNIQUE NONCLUSTERED ( [acode] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
执行如下SQL语句,创建一些数据:
insert into pub_area(acode,aname,parent_acode) values('01','天津市','') insert into pub_area(acode,aname,parent_acode) values('0101','南开区','01') insert into pub_area(acode,aname,parent_acode) values('010101','学府街道','0101') 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#
一些实用方法
获取数据进行呈现
simpleSystemTreeview方法主要是通过DataSet数据源进行提取呈现在 TreeView 控件上,方法返回 int 类型,表示成功返回当前节点的节点数,其参数设置见下表:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | tv | System.Web.UI.WebControls.TreeNodeCollection | 传入的TreeView的当前结点集合对象 |
2 | ds | DataSet | 数据集对象,默认只取Tables[0] |
3 | key | string | 数据表的唯一标识字段名 |
4 | parentkey | string | 数据表的父结点字段名 |
5 | dis | string | 数据表的显示名称字段名 |
6 | keytype | string | 标识类型,这是我们自定的规范,比如CID(字符)、ID(数值)固定名称的处理方式,默认处理方式对key或parentKey进行字符串过滤处理 |
7 | initvalue | string | 是否指定一个初始值 |
8 | firstlevel | bool | 是否指遍历一级,如果为true,则不在进行递归 |
9 | initByKey | bool | 初始值使用哪个关键字段,false使用父节点,true使用唯一标识,默认为false |
实现代码如下:
public int simpleSystemTreeview(System.Web.UI.WebControls.TreeNodeCollection tv, DataSet ds, string key, string parentkey, string dis, string keytype, string initvalue, bool firstlevel, bool initByKey) { int rv = 0; DataView dv = new DataView(); dv.Table = ds.Tables[0]; System.Web.UI.WebControls.TreeNode tmpNd; if ((keytype == "uniqueidentifier") && (initvalue == "")) { dv.RowFilter = " " + (initByKey == false ? parentkey : key) + " is null "; } else { dv.RowFilter = "isnull(" + (initByKey == false ? parentkey : key) + ",'')='" + initvalue + "'"; } rv = dv.Count; foreach (DataRowView drv in dv) { tmpNd = new System.Web.UI.WebControls.TreeNode(); tmpNd.Value = drv[key].ToString(); tmpNd.Text = drv[dis].ToString(); // tmpNd.ImageUrl="../images/"+drv["Caption"].ToString(); // tmpNd.NavigateUrl="../"+drv["Caption"].ToString(); tv.Add(tmpNd); if (!firstlevel) simpleSystemTreeview(tmpNd.ChildNodes, ds, key, parentkey, dis, keytype, tmpNd.Value, firstlevel, false); } return rv; }
前端示例代码如下:
<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="FALSE" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Web.UI.WebControls" %>
成功后显示如下图:
获取所有的结点
GetSystemTreeViewAllNodes 方法获取当前给定集合的所有结点对象,并存储到指定的ArrayList当中,其参数说明见下表:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | tv | System.Web.UI.WebControls.TreeNodeCollection | 传入的TreeView的当前结点集合对象 |
2 | rv2 | ArrayList | 要存储的 ArrayList |
实现代码如下:
public void GetSystemTreeViewAllNodes(System.Web.UI.WebControls.TreeNodeCollection tv, ArrayList rv2) { for (int i = 0; i < tv.Count; i++) { rv2.Add(tv[i]); GetSystemTreeViewAllNodes(tv[i].ChildNodes, rv2); } }
调用示例如下,获取南开区的所有街道的结点对象:
ArrayList rv2 = new ArrayList(); GetSystemTreeViewAllNodes(tv.Nodes, rv2); Response.Write(rv2.Count);
小结
1、由于System.Web.UI.WebControls.TreeView是内置控件,因此在Web页中直接引用命名空间即可直接使用,使用 VS 开发我们需要在 IDE环境解决方案中添加 System.Web 引用,如下图:
2、System.Web.UI.WebControls.TreeNode() 在递归遍历的时候,需要提供 ChildNodes,Microsoft.Web.UI.WebControls.TreeView 则传递 Nodes
3、System.Web.UI.WebControls.TreeNode() 的使用 Value表示值, Microsoft.Web.UI.WebControls.TreeView 则使用 ID 表示唯一标识
4、System.Web.UI.WebControls.TreeView 在 Web 页面引用命名空间后可以直接使用值, Microsoft.Web.UI.WebControls.TreeView 则需要使用 Register 命令,并需要下载对应的Dll库到网站的 Bin 目录下。
因此建议使用 System.Web.UI.WebControls.TreeView 进行开发,详细介绍和用法可参照如下链接:
TreeView 类 (System.Web.UI.WebControls) | Microsoft Learn
感谢您的阅读,希望本文能够对您有所帮助。
还没有评论,来说两句吧...