开发者

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

目录
  • 关于 FlyTreeView
  • DataSet 数据准备
  • 范例运行环境
  • 方法设计
  • 代码实现
    • 方法代码
    • 调用示例
  • 小结

    关于 FlyTreeView

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

    显示效果如下图:

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

    DataSet 数据准备

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

    序号字段名类型说明
    1ciduniqueidentifier唯一标识
    2Group_Ciduniqueidentifier所属群组ID标识(引用群组表groups)
    3Account_Ciduniqueidentifier人员帐户ID(引用用户表Accounts,用于显示昵称、姓名等)
    4parent_Ciduniqueidentifier父结点ID,所属管理者ID
    5sortcodeint同级排序号
    6sys_insusernvarchar(100)创建者用户名
    7sys_instimedatetime创建时间
    8sys_updusernvarchar(100) 最后修改者用户名
    9sys_updtimedatetime最后修改时间

    该表所涉及的引用表这里不在赘述,我们假设有如下 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,
        [androidGroup_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
    

    用户表

    android
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [dbo].[accounts](
        [cid] [uniqueidentifier] ROWGUIDCOL  NOT NULphpL,
        [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方法返回结点总数,其参数说明见下表:

    序号参数名类型说明
    1tvFlyTreeNodeCollection传入的FlyTreeView的当前结点集合对象
    2dsDataSet数据集对象,默认只取Tables[0]
    3keystring数据表的唯一标识字段名
    4parentkeystring数据表的父结点字段名
    5disstring数据表的显示名称字段名
    6keytypestring标识类型,这是我们自定的规范,比如CID(字符)、ID(数值)固定名称的处理方式,默认处理方式对key或parentKey进行字符串过滤处理
    7initvaluestring是否指定一个初始值
    8firstlevelbool是否指遍历一级,如果为true,则不在进行递归
    9initByKeybool初始值使用哪个关键字段,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].ToStrAiOCXXting();
                        tv.Add(tmpNd);
                        if (!firstlevel)
                            simpletreeview(tmpNd.ChildNodes, ds, key, parentkey, dis, keytype, tmpNd.Value,firstlevel,false);
                    }
                    return rv;
    }

    调用示例

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

    &www.devze.comlt;%@ 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、在 VS 中开发我们需要在 IDE环境解决方案中添加此 dll,并引用,如下代码:

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

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

    其参数说明见下表:

    序号参数名类型说明
    1tvFlyTreeNodeCollection要遍历的TreeView集合
    2rv2ArrayList要存储的 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 更多操作这里不再做进一步说明,请参考其官网说明。

    到此这篇关于C# DataSet结合FlyTreeView实现显示树状模型数据的文章就介绍到这了,更多相关C# DataSet显示树状模型数据内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜