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

news2025/1/12 12:30:30

 

目录

关于 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
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#

一些实用方法

获取数据进行呈现

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1654382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++历练之路】STL中的哈希——手搓哈希底层逻辑

W...Y的主页 &#x1f495; 代码仓库分享 &#x1f60a; 前言&#xff1a; "hash"通常指的是哈希&#xff0c;它是一种将数据&#xff08;如字符串或者数字&#xff09;转换为一个固定长度的数值&#xff08;通常是整数&#xff09;的方法。哈希函数能够将任意长度…

背靠腾讯电商的视频号小店项目,怎么去操作呢?新手做店必看!

大家好&#xff0c;我是电商小V 视频号小店作为腾讯电商推出的电商项目&#xff0c;可以说现在就是处于爆火的状态&#xff0c;一直也是备受关注的&#xff0c;同时也是吸引了很多的玩家入驻&#xff0c;因为视频号小店就是一个新的平台&#xff0c;一个新的场地&#xff0c;现…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…

flask框架的初步认识

flask框架的初步认识 这是一个轻量级的网页框架&#xff0c;在运行后&#xff0c;就相当于服务器&#xff0c;当用户输入URL就会触发对应的事件调用方法&#xff0c;返回给用户一个网页文件&#xff0c;并通过自动识别html标签&#xff0c;来为用户呈现对应的样式和效果&#…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是&#xff0c;当我们按下数字1快捷键&#xff0c;我们的技能按钮会进入倒计时&#xff0c;如下图演示&#xff1a; 一、新建场景和根节点设置 新建场景&#xff0c;选择TextureButton作为根节点&#xff0c;重名为SpellButton&#xff0c;保存场景…

鸿蒙开发接口Ability框架:【 (ServiceExtensionAbility)】

ServiceExtensionAbility ServiceExtensionAbility模块提供ServiceExtension服务扩展相关接口的能力。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 导入…

通讯录项目—顺序表实现

在上次我介绍顺序表后相信大家对顺序表有了一定的了解&#xff0c;现在就让我们来练练如何用它&#xff0c;这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。 目录 通讯录简介 创建用户信息 适配和理解通讯录 功能实现 初始化通讯录 销毁通讯录 增加…

【高阶数据结构】图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime

图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime 一、图的概述1、概述&#xff08;纯理论部分&#xff09;2、邻接矩阵&#xff08;实现一个添加边的图&#xff09;&#xff08;1&#xff09;思路介绍&#xff08;2&#xff09;代码部分&#xff08;3&#xff09;测试部分 3、…

系统如何做好安全加固?

一、Windows系统 Windows系统出厂时&#xff0c;微软为了兼容性&#xff0c;默认并未对系统安全做严格的限制&#xff0c;因此还需要做一些基本的安全加固&#xff0c;方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁&#xff1f;很多人感觉漏洞更新没必要&#x…

基准电流源仿真

注意连线PMOS必须连接到VDD上&#xff0c;NMOS练到GND上 1.记得选择PNP之后&#xff0c;直接按Q就可以直接选择并联个数&#xff0c;不需要用器件。 2.记得调整放大器如图所示&#xff0c;否则会出错。 3.记得先调整PMOS的宽长比 4.按比例调节R2和R3的阻值 5.仿真的时候&#…

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff08;双向Transformer 的预训练&#xff09; 核心技术&#xff1a; Embedding 、Attention --> Transformer 任务简介、拟解决问题…

springboot+vue+mybatis图书推荐管理系统的设计与实现+PPT+论文+讲解+售后

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;图书推荐管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

医学论文摘要翻译 中译英哪里比较专业

论文摘要是对论文内容不加注释和评论的简短陈述&#xff0c;需要扼要说明论文的目的、研究方法和最终结论。在发表学术论文时&#xff0c;很多重要刊物会要求作者将文章的摘要翻译成英文。那么&#xff0c;针对医学论文摘要翻译&#xff0c;中译英哪里比较专业&#xff1f; 专…

动态规划——路径问题:931.下降路径最小和

文章目录 题目描述算法原理1.状态表示&#xff08;经验题目&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;931.下降路径最小和 关于这⼀类题&#xff0c;看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…

树莓派4b测量心率、血氧浓度值

1.MAX30102心率和血氧浓度值连接图 2.MAX30102工作原理 工作原理 MAX30102采用PPG光电容积脉搏波描记法(PhotoPlethysmoGraphy)测量数据,微控制器对这些数据进行处理运算过后得到心率血氧数值,再通过I2C或UART接口输出,大大降低了传感器的使用难度和对主控的资源占用。同时…

力扣刷题--数组--第三天

今天再做两道二分查找的题目&#xff0c;关于二分查找的知识可看我前两篇博客。话不多说&#xff0c;直接开干&#xff01; 题目1&#xff1a;69.x 的平方根 题目详情&#xff1a;   给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#…

Linux(openEuler、CentOS8)企业内网samba服务器搭建(Windows与Linux文件共享方案)

本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验1. 安装samba2. 启动smb服务并设置开机启动3. 查看服务器监听状态4. 配置共享访问用户5. 创建共享文件夹6. 修改配置文件7. 配置防火墙8. 使用windows…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…