C# DataSet结合FlyTreeView显示树状模型数据

简介: C# DataSet结合FlyTreeView显示树状模型数据

关于 FlyTreeView

NineRays.WebControls.FlyTreeView 是 9rays.net 推出的一款功能强大的树状模型数据显示控件,本文将介绍使用其 Asp.net 版本控件,并结合 DataSet 对象进行数据显示。

显示效果如下图:

DataSet 数据准备

我们在 MS SQL Server 创建 groupUsers(群组用户表),其结构如下表:

序号 字段名 类型 说明
1 cid uniqueidentifier 唯一标识
2 Group_Cid uniqueidentifier 所属群组ID标识(引用群组表groups)
3 Account_Cid uniqueidentifier 人员帐户ID(引用用户表Accounts,用于显示昵称、姓名等)
4 parent_Cid uniqueidentifier 父结点ID,所属管理者ID
5 sortcode int 同级排序号
6 sys_insuser nvarchar(100) 创建者用户名
7 sys_instime datetime 创建时间
8 sys_upduser nvarchar(100) 最后修改者用户名
9 sys_updtime datetime

最后修改时间

该表所涉及的引用表这里不在赘述,我们假设有如下 SQL 语句:

select a.cid,a.parent_cid,nickname+'('+name+')' truename
from groupUsers a,accounts b 
where a.group_cid=@group_cid 
and a.account_cid=b.cid

我们需要重点得到 cid(唯一标识)、parent_cid(父节点ID) 和 truename (显示名称) 三个字段。查询并写入到 DataSet 中。

涉及表结构创建脚本

群组用户表

SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[groupUsers](
  [cid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
  [Group_Cid] [uniqueidentifier] NOT NULL,
  [Account_Cid] [uniqueidentifier] NOT NULL,
  [parent_Cid] [uniqueidentifier] NULL,
  [sortcode] [int] NULL,
  [sys_insuser] [nvarchar](100) NULL,
  [sys_instime] [datetime] NULL,
  [sys_upduser] [nvarchar](100) NULL,
  [sys_updtime] [datetime] NULL,
 CONSTRAINT [PK_groupUsers] PRIMARY KEY CLUSTERED 
(
  [cid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_cc_groupUsers] UNIQUE NONCLUSTERED 
(
  [Group_Cid] ASC,
  [parent_Cid] ASC,
  [Account_Cid] 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
 
ALTER TABLE [dbo].[groupUsers] ADD  CONSTRAINT [DF_groupUsers_cid]  DEFAULT (newid()) FOR [cid]
GO
 

用户表

SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[accounts](
  [cid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
  [name] [nvarchar](50) NULL,
  [nickname] [nvarchar](500) NULL
 
)GO
 
ALTER TABLE [dbo].[accounts] ADD  CONSTRAINT [DF_accounts_cid]  DEFAULT (newid()) FOR [cid]
GO
 
 

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

方法设计

simpletreeview方法返回结点总数,其参数说明见下表:

序号 参数名 类型 说明
1 tv FlyTreeNodeCollection 传入的FlyTreeView的当前结点集合对象
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

代码实现

方法代码

int simpletreeview(fwebcontrols.FlyTreeNodeCollection 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];
 
                fwebcontrols.FlyTreeNode tmpNd;
                switch (keytype)
                {
                    case "cid": dv.RowFilter = initvalue == "" ? " " + (initByKey == false ? parentkey : key) + " is null " : " " + (initByKey == false ? parentkey : key) + "='" + initvalue + "'"; break;
                    case "id": dv.RowFilter = initvalue == "" ? " " + (initByKey == false ? parentkey : key) + " is null " : "" + (initByKey == false ? parentkey : key) + "=" + initvalue + ""; break;
                    default: dv.RowFilter = "isnull(" + (initByKey == false ? parentkey : key) + ",'')='" + initvalue + "'"; break;
                }
                rv = dv.Count;
                foreach (DataRowView drv in dv)
                {
                    tmpNd = new fwebcontrols.FlyTreeNode();
                    tmpNd.Text = drv[dis].ToString();
                    tmpNd.Value = drv[key].ToString();
                    tv.Add(tmpNd);
                    if (!firstlevel)
                        simpletreeview(tmpNd.ChildNodes, ds, key, parentkey, dis, keytype, tmpNd.Value,firstlevel,false);
                }
                return rv;
}

调用示例

我们首先需要在页面注册控件,代码如下:

<%@ Register Assembly="Microsoft.Web.UI.WebControls" Namespace="Microsoft.Web.UI.WebControls" TagPrefix="codn" %>

前端代码如下:

<NineRays:FlyTreeView ID="userTree" ExpandLevel="4" Width="100%" CssClass="form-control" runat="server" Style="padding-top: 10px; padding-bottom: 10px; height: 400px;" CanBeSelected="true" BackColor="White"
                    PostBackOnSelect="False"
                    EnableTheming="True" ImageSet="Office2003" ImageSetCustomPath="/images/vista/"
                    ContentClickTogglesCheckbox="True" IsCheckbox="True">
                    <SelectedStyle BackColor="#BFCFFF" />
</NineRays:FlyTreeView>

后端调用代码如下:

 
userTree.Nodes.Clear();
object ds=InitDataSet();
string initvalue="";
if(RowsCount==0) return 0;
 
simpletreeview(userTree.Nodes, (DataSet)ds, "cid", "parent_cid", "truename", "cid","", false, initvalue != "" ? true : false);
 
userTree.ContentClickCollapses = true;
userTree.ContentClickExpands = true;

小结

1、示例代码中如何获取 DataSet 数据需要我们自行进行编写代码处理,这里只是抽象展示。

2、使用控件前需要下载dll并放置到您的网站bin目录下,可以到我的资源进行下载,链接如下:

https://download.csdn.net/download/michaelline/89211649

请注意,该控件是付费资源,未经许可在使用中可能会出现运行错误或其它问题,目前我的下载资源可以免费使用,在使用过程暂未发现此问题,更多咨询请访问如下链接:

https://www.9rays.net/Category/62-treeview-asp-net.aspx

3、在 VS 中开发我们需要在 IDE环境解决方案中添加此 dll,并引用,如下代码:

using fwebcontrols = NineRays.WebControls;

 

4、提供一个后端辅助方法 getFlyTreeViewAllNodes,可以获得FlyTreeView的所有结点信息,并放置到 ArrayList 中。

其参数说明见下表:

序号 参数名 类型 说明
1 tv FlyTreeNodeCollection 要遍历的TreeView集合
2 rv2 ArrayList 要存储的 ArrayList 变量

方法代码如下:

public void getFlyTreeViewAllNodes(fwebcontrols.FlyTreeNodeCollection tv, ArrayList rv2)
{
     for (int i = 0; i < tv.Count; i++)
     {
         rv2.Add(tv[i].Value);
         getFlyTreeViewAllNodes(tv[i].ChildNodes, rv2);
     }
}

方法会在指定的 ArrayList 里存储 TreeView 的 Value 值 。

关于 NineRays.WebControls.FlyTreeView 更多操作这里不再做进一步说明,请参考其官网说明。

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

相关文章
|
6月前
|
C# 数据库
c# dev Form1 gridview1使用Form2 gridview1的数据
c# dev Form1 gridview1使用Form2 gridview1的数据
|
3月前
|
测试技术 API C#
C#使用Bogus生成测试数据
C#使用Bogus生成测试数据
54 1
|
1月前
|
SQL 缓存 分布式计算
C#如何处理上亿级数据的查询效率
C#如何处理上亿级数据的查询效率
23 1
|
1月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
36 0
|
2月前
|
存储 C# 开发者
枚举与结构体的应用:C#中的数据组织艺术
在C#编程中,枚举(`enum`)和结构体(`struct`)是非常重要的数据类型。枚举用于定义命名常量集合,提高代码可读性;结构体则封装相关数据字段,适合小型数据集。本文从基本概念入手,探讨它们的使用技巧、常见问题及解决方案,帮助开发者更好地利用这些特性构建健壮的应用程序。
43 8
|
1月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
366 0
|
3月前
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
解决C#对Firebase数据序列化失败的难题
|
3月前
|
数据库
C#Winform使用NPOI获取word中的数据
C#Winform使用NPOI获取word中的数据
183 2
|
3月前
|
数据采集 XML C#
C#简化工作之实现网页爬虫获取数据
C#简化工作之实现网页爬虫获取数据
66 1
|
3月前
|
数据库 C#
C# 使用SqlDataAdapter和DataSet来访问数据库
C# 使用SqlDataAdapter和DataSet来访问数据库
30 0