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

2024-05-05 23:12

本文主要是介绍C# Web控件与数据感应之 TreeView 类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

关于 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 语句:

SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE 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#

一些实用方法

获取数据进行呈现

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

实现代码如下:

		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){int rv=0;DataView dv=new DataView();dv.Table=ds.Tables[0];Microsoft.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 Microsoft.Web.UI.WebControls.TreeNode();tmpNd.ID=drv[key].ToString();tmpNd.Text=drv[dis].ToString();//    tmpNd.ImageUrl="../images/"+drv["Caption"].ToString();//    tmpNd.NavigateUrl="../"+drv["Caption"].ToString();tv.Add(tmpNd);if(!firstlevel)simpletreeview(tmpNd.Nodes,ds,key,parentkey,dis,keytype,tmpNd.ID,firstlevel,false);}return rv;}

调用示例如下代码:

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="FALSE" %>
<%@ Register TagPrefix="codn" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls"%>
<%@ Import Namespace="System.Data" %><script language="C#" runat="server">void Page_Load(Object sender, EventArgs e){if (Page.IsPostBack) { return; }object rvvv=GetDataSet("select acode,aname,parent_acode from pub_area", null);DataSet _ds = rvvv as DataSet;int rvvv_count = simpletreeview(tv.Nodes, _ds, "acode", "parent_acode", "aname", "uniqueidentifier", "",false,false);
//        Response.Write(rvvv_count);return;}</script>
<html>
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=yes"/><title></title></style>
</head>
<body>
<form runat="server">
<div style=" margin-top:50px;margin-left:50px"><codn:TreeView ID="tv" runat="server" Height="300" ShowLines="true"  Width="500" AutoPostBack="false" ExpandLevel="3" BackColor="White" style="font-family: 微软雅黑" EnableTheming="True"  BorderColor="#003300" BorderStyle="Solid" BorderWidth="1px"></codn:TreeView></div></form>
</body><script type="text/javascript">
</script></html>

成功后如下图显示:

根据ID设置节点

SetTreeViewById 方法对当前给定集合进行ID查找,并返回结点ID和选中当前结点,其参数说明见下表:

序号参数名类型说明
1tv

Microsoft.Web.UI.WebControls.

TreeNodeCollection

传入的TreeView的当前结点集合对象
2idstring要查找的ID

实现代码如下:

public string SetTreeViewById(Microsoft.Web.UI.WebControls.TreeNodeCollection tv,string id){string findid="";for(int i=0;i<tv.Count;i++){ if(tv[i].ID==id) { string index1=tv[i].GetNodeIndex();//取得index object tn=tv[i];while(tn.GetType()==typeof(Microsoft.Web.UI.WebControls.TreeNode)){tn = ((Microsoft.Web.UI.WebControls.TreeNode)tn).Parent;}if(tn.GetType()==typeof(Microsoft.Web.UI.WebControls.TreeView)){((Microsoft.Web.UI.WebControls.TreeView)tn).SelectedNodeIndex = index1;}findid=i.ToString();break;}		SetTreeViewById(tv[i].Nodes,id);}return findid;
}

调用代码如下,本示例要查找南开区(ID为0101)的节点并选中:

SetTreeViewById(tv.Nodes, "0101");

成功后如下图:

获取所有结点的索引 

GetTreeViewAllNodes 方法获取当前给定集合的所有结点的索引,并存储到指定的ArrayList当中,其参数说明见下表:

序号参数名类型说明
1tv

Microsoft.Web.UI.WebControls.

TreeNodeCollection

传入的TreeView的当前结点集合对象
2rv2ArrayList要存储的 ArrayList

实现代码如下:

public void GetTreeViewAllNodes(Microsoft.Web.UI.WebControls.TreeNodeCollection tv,ArrayList rv2)
{for(int i=0;i<tv.Count;i++){ rv2.Add(tv[i].GetNodeIndex());GetTreeViewAllNodes(tv[i].Nodes,rv2);}}

调用示例如下,获取南开区的所有街道结点的索引:

ArrayList rv2 = new ArrayList();
GetTreeViewAllNodes(tv.Nodes, rv2);
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 变量

方法代码如下:

public void simplebomlist(DataSet ds,string key,string parentkey,string initvalue,ArrayList rv2)
{DataView dv=new DataView();dv.Table=ds.Tables[0];dv.RowFilter="isnull("+parentkey+",'')='"+initvalue+"'";foreach(DataRowView drv in dv){rv2.Add(drv[key].ToString());simplebomlist(ds,key,parentkey,drv[key].ToString(),rv2);}
}

方法会在指定的 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

感谢您的阅读,希望本文能够对您有所帮助。

这篇关于C# Web控件与数据感应之 TreeView 类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962919

相关文章

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的