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

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: C# Web控件与数据感应之 TreeView 类

关于 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(区域表),其结构如下表:

序号 字段名 类型 说明
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#

一些实用方法

获取数据进行呈现

simpletreeview方法主要是通过DataSet数据源进行提取呈现的TreeView控件上,方法返回 int 类型,表示成功返回当前节点的节点数,其参数设置见下表:

序号 参数名 类型 说明
1 tv

Microsoft.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 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和选中当前结点,其参数说明见下表:

序号 参数名 类型 说明
1 tv

Microsoft.Web.UI.WebControls.

TreeNodeCollection

传入的TreeView的当前结点集合对象
2 id string 要查找的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当中,其参数说明见下表:

序号 参数名 类型 说明
1 tv

Microsoft.Web.UI.WebControls.

TreeNodeCollection

传入的TreeView的当前结点集合对象
2 rv2 ArrayList 要存储的 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 中。

其参数说明见下表:

序号 参数名 类型 说明
1 tv TreeNodeCollection 要遍历的TreeView集合
2 key string 关键字段名
3 parentkey string 父项关键字段名
4 initvalue string 要查找的关键字段值
5 rv2 ArrayList 要存储的 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

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

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
2月前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
70 4
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
83 2
|
1月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
3月前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
13 0
|
2月前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
83 0
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
27 2
|
4月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
346 0
|
4月前
|
开发者 Java Spring
JSF 牵手社交登录,如魔法风暴席卷 Web 世界,开启震撼便捷登录之旅!
【8月更文挑战第31天】在互联网时代,便捷登录成为用户的核心需求。社交登录凭借其便捷性、安全性和社交化的特点,在各类Web应用中广泛应用。JavaServer Faces(JSF),作为一款流行的Java Web框架,能够轻松集成社交登录功能,显著提升用户体验。本文详细介绍社交登录的优势,并提供两种JSF集成社交登录的常见方法:一是利用Spring Social等第三方库简化开发;二是自行实现社交登录流程。开发者可根据项目需求选择适合的方案。
44 0