利用TreeView实现层次结构数据导航查询_第1页
利用TreeView实现层次结构数据导航查询_第2页
利用TreeView实现层次结构数据导航查询_第3页
利用TreeView实现层次结构数据导航查询_第4页
利用TreeView实现层次结构数据导航查询_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文章发表于【电脑开发与应用】,引用请注明出 处,谢谢!利用TreeView实现层次结构数据导航查询摘 要:为了充分发挥TreeView控件展示数据和导航查询的作用,文章通过一个通讯录实例,介绍了如 何在ADO.NET中利用TreeView实现层次结构数据的加载及导航查询,讨论了如何做到精准导航查询。文章提 出的改进的导航查询方案中的自定义函数,具有一定的借鉴意义。关键词:ADO.NET; TreeView;层次结构数据;导航查询引言C#是微软推出的基于.NET平台的开发语言,是一种使用简单、功能强大、表达力丰富的语言。Visual Studio 2008中,.NET在数据存取方面做了很大的调整

2、。在.NET框架下,数据存取是由ADO.NET来完成的。 ADO.NET是一组用于和数据源进行交互的面向对象类库,通常情况下,数据源是数据库。TreeView是一个重要的常用控件,经常充当导航器的作用。在实际的软件开发中,常常需要将TreeView 与数据库进行连接,以填充其节点。用TreeView可以显示诸如商品分类、区域名称等等的层次结构数据。 在大部分软件的开发中,TreeView都是一个不可缺少的展示或者导航控件。TreeView的内容加载一般来讲 有三种方式:(1)界面设计时在TreeView设计器或者代码中直接填充TreeView控件。(2)从XML文件中 读取数据建立树型结构。(

3、3)从数据库中读取数据,建立树型结构。本文将通过一个简单的通讯录实例, 介绍如何在ADO.NET中利用TreeView实现层次结构数据的导航查询。数据表设计本文TreeView控件的数据源,主要有三个字段:即分组号(id)、分组名称(groupName)、上一级分 组号(parentId)。约定分组号作为用来标识当前分组的唯一标识。当分组的parentId为0时,表示该分组为 顶级分组,否如arentId为一个大于0的值。如此形成一个具有层次结构的数据源。存放联系人分组的groups 表如表1所示。构造groups表数据的内容如图1所示。/表dbo.groupsidgroupNameparen

4、tId1我的同学02初中同学13高中同学14大学同学15我的同事06领导57同事58我的朋友09本科同学410研究生同学413常联系的814不常联系的8表1联系人分组groups表结构字段名数据类型主键备注idInt是分组id号groupNameVarchar否分组名称parentIdInt否上一级分组号图1 groups表数据另外,实例中还需要一个联系人信息表addressList,构造表中数据如图2所示,其中groupId字段用来标 记联系人所在分组的组号。表db o. addr e s sLi s t 摘要idIxrNamesexbirthqqmobilehomeaddressgroup

5、ld TOC o 1-5 h z In 张小易 男 1981-1. 24242424二泉东路2342号312李小齐女1980-4.234234民路 123号9王晓丹男1982-3.56575813934242441解放路 23 号3郭文文女1985-4.678353413935345345旺庄路344号10陈尔东男1983Y.2142377713823423444解放路9号9徐茜茜女1988-4.6796793413454353555人民路88号2庞倍倍女1990-4.23425413634234234新华路234号6黄飞飞男1983-6.2

6、34674心路98号7颜娟娟女1981-8.234235民路8号13郑佩I页女1992-9.12355513523423442上海路98号14彭诗诗女1983-5.,145487413106586546旺庄路 12号10图2联系人信息表数据3. TreeView数据加载及其导航查询的实现TreeView的数据来源于数据库,本文将采用ADO.NET技术中的强类型D ataSet实现。3.1 强类型 DataSetDataSet属于弱类型,这意味着无论何时从DataSet中检索值,值都以System.Object的形式返回,需要 对这种值进行转换

7、。不幸的是,失败不是在编译时发生,而是在运行时发生。要访问弱类型DataTable中的 一个特定字段,我们需要用这样的句法:DataTable.Rowsindex columnName。由此,DataTable的弱类 型性质表现在于,我们需要通过一个字符串或序号索引来访问字段名称。而一个强类型的D ataTable,它的 所有的字段都是通过属性的形式来实现的,访问的编码就会象这样:DataTable.Rowsindex.columnName。要返回强类型对象,开发人员可以创建自定义业务对象,或者使用强类型的D ataSet。开发人员实现的 业务对象类,其属性往往是对相应的底层数据表的字段的映射

8、。而一个强类型的DataSet,则是Visual Studio 基于数据库schema为我们生成的一个类,其成员的类型都是由这个schema决定的。强类型的DataSet本身, 是由继承于ADO.NET中DataSet、DataTable和DataRow类的子类组成的。除了强类型的DataTable外,强类型 的DataSet现在还包括TableAdapter类,这些类包含了填充DataSet中的DataTable和把DataTable的改动传回 数据库的各种方法。借助Visual Studi。中的工具,很容易生成强类型的数据集。篇幅所限,本文对强类型数据集的配置与使 用,以及项目窗体设计与配

9、置不做详述。生成后的强类型数据集DataSet1.xsd如图3所示。图3强类型数据集DataSetl.xsd在DataSet1.xsd中的 addressList添加一个查询,配置查询语句为:select * from addressList wheregroupId=id,最后生成名为FillById和GetDataById的方法,主要用于返回指定分组编号的联系人信息。id 是一个参数,调用FillById或GetDataById方法时,需要为其赋值。3.2 TreeView的数据加载Treeview是由节点TreeNode组成的,第一级TreeNode称之为根节点,在根节点之下一级的称之为

10、某个 根节点的子节点,某个子节点之下一级的子节点就称为该子节点的子节点。我们一般常用节点的两个属性: 一个是Text属性,即用来记录显示出来的内容;另一个是Tag属性,一般用唯一标识码对其进行标识,以用 于在使用时对节点的识别。采用递归方法FillTree实现TreeView数据的动态加载,FillTree代码如下:public void FillTree(TreeNodeCollection tns, int strParentID)TreeNode tmpNd; int intId;DataView dv = new DataView(dataSet11.groups);dv.RowFil

11、ter = parentId= + strParentID + ”;筛选出该分组下的所有分组foreach (DataRowView drv in dv) tmpNd = new TreeNode();intId = Convert.ToInt32(drvid.ToString();tmpNd.Text = drvgroupName.ToString();tns.Add(tmpNd); /遍历每个子分组,添加到该分组中FillTree(tmpNd.Nodes, intId);/递归添加子分组的子分组在窗体的Form1_Load事件中,添加如下代码 FillTree(treeView1.Node

12、s, 0); treeView1.ExpandAll();,运 行程序,效果如图4所示。我的同学初中同学 高中同学大学同学 本科同学 研究生同学我的同事领导同事我的朋岌 常联系的不常联系的图4 TreeView的数据加载3.3导航查询的实现为了确保选中TreeView的某个节点后,窗体右侧dataGridView中能显示组内的联系人,我们想到可以 在TreeNode的Tag属性中绑定当前分组的id号,然后把此id号传递到FillById方法,最终将查询得到的数据显 示在dataGridView里。编写treeView 1的AfterSelect事件代码如下,实现效果如图5所示。private

13、void treeView1_AfterSelect(object sender, TreeViewEventArgs e) addressListTableAdapter1.FillById(dataSet11.addressList, (int)e.Node.Tag);图5 TreeView导航查询效果3.4改进后的导航查询的实现分析如上导航查询,我们可以发现一个问题。例如,当选中“本科同学”节点后,右侧显示两条联系 人信息,如图5所示。当选中“大学同学”节点后,因为“本科同学”是包含在“大学同学”分组里的,此 两条联系人信息理应要显示,但事实并未显示,原因也很容易想到。由此,针对这种层次

14、结构的数据导航 查询,我们需要改进。思路就是,当选中某个分组后,我们应该可以查询出来该组及其所有子分组的信息。 在SQL Server中编写如下自定义函数,实现检索分组及该分组下的所有分组。函数代码如下:CREATE function dbo.f_getChild(ID int)returns t table(ID int,gname varchar(50),PID int,tLevel int)函数返回包含组号,组名,上级组号以及层次的表asbegindeclare i intset i = 1 标记当前层次的变量insert into t select ID,groupName,paren

15、tID,i from groups where ID = IDwhile rowcount 0beginset i= i+ 1 层次变量自增insert into tselect a.ID,a.groupname,a.parentID,ifrom groups a,t bwhere a.parentID=b.ID and b.tLevel = i-1筛选上一级组号与等于当前id的分组,即子分组endreturnend借助以上自定义函数,如果想查询“大学同学”下所有分组,我们只需要如此操作:Select * from f_getChild(4)“大学同学”组号为4,在SQL Server查询分析

16、器中执行查询,结果如图6所示。J结果消息IDgnamePIDt Level14大学同学112本科同学231=研究生同学2图6 f_getChild函数演示效果接下来,我们需要更改强类型数据集DataSet1.xsd中addressList里的FillById和GetDataById方法为如下 SQL语句:select * from addressList where groupId in ( select id from f_getChild(id),此处用到一个嵌套子 查询。再次运行程序,选中TreeView的“大学同学”和“本科同学”后,效果分别为图7、图8所示,问题完 美解决。图7选中“

17、大学同学”后效果图图8选中“本科同学”后效果图4.结束语在.NET平台中,借助C#语言,利用Treeview控件与ADO.NET的访问数据库的典型方法,实现了对SQL Server数据库中层次结构数据的动态加载,并完美实现了导航查询功能。尤其是改进后的导航查询方法中的 自定义函数,具有很典型的意义。借助该函数,不仅可以实现分组的导航,对于维护分组下的所有子分组 信息都具有一定的借签意义。参考文献1 Microsoft. Microsoft Visual Studio 2008 文档. 吴文强.用自定义TreeView控件实现层次结构数据浏览功能J.电脑编程技巧与维护.2010.9:44-453魏斌,马继辉,牛虎.基于递归算法的树型结构图的设计与实现J.计算机应用于软件.2011.1:97TO IMPLEMENT THE SEARCH OF NAVIGATION ABOUTHIERARCHICAL DATA WITH TREEVIEW(Abstract: In order to display data and navigate data, the paper take an address book for example, introduced how to use TreeView in ADO.NET to load data and implement the

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论