前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# Web控件与数据感应之 TreeView 类 续篇

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

作者头像
初九之潜龙勿用
发布2024-06-20 13:32:52
770
发布2024-06-20 13:32:52
举报
文章被收录于专栏:技术文章技术文章

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

代码语言:javascript
复制
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语句,创建一些数据:

代码语言:javascript
复制
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

数据集对象,默认只取Tables0

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

实现代码如下:

代码语言:javascript
复制
        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;
        }

前端示例代码如下:

代码语言:javascript
复制
<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="FALSE" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>

<script language="C#" runat="server">
    public CosysJaneCommonAPI.CODAL dal = new CosysJaneCommonAPI.CODAL();
    void Page_Load(Object sender, EventArgs e)
    {

        if (Page.IsPostBack) { return; }
        object rvvv=dal.GetDataSet("select acode,aname,parent_acode from pub_area", null);
        DataSet _ds = rvvv as DataSet;
        int rvvv_count = dal.simpleSystemTreeview(tv.Nodes, _ds, "acode", "parent_acode", "aname", "uniqueidentifier", "",false,false);
        Response.Write(rvvv_count);

    }
 </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">
       <asp: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">
        </asp:TreeView>

</div>
 </form>
</body>
 
<script type="text/javascript">
</script>
 
</html>

成功后显示如下图:

获取所有的结点

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

序号

参数名

类型

说明

1

tv

System.Web.UI.WebControls.TreeNodeCollection

传入的TreeView的当前结点集合对象

2

rv2

ArrayList

要存储的 ArrayList

实现代码如下:

代码语言:javascript
复制
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);
     }

}

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

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 两者的区别
  • 准备数据源
    • 范例运行环境
    • 一些实用方法
      • 获取数据进行呈现
            • 获取所有的结点
            • 小结
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档