基于分级流水码的动态TREEVIEW在NET20中的应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于分级流水码的动态TREEVIEW在.NET2.0中应用研究赵士坤刘秀益肖飞西部钻探工程有限公司克拉玛依钻井公司克拉玛依市834009摘要做WEB系统开发过程中都会遇到一个基本的应用,导航应用。在WEB模式下的导航方式有很多种但总体来说没有C/S模式下那样灵活,有些平台提供成熟组件例如.NET2.0,有些则要通过用户自己编写组件例如JAVA。对于一般级别的用户来说,能够有一种标准控件的选择是很受欢迎的,这样就可以把程序开发人员解放出来把大量的精力投入到系统开发的业务逻辑上来,更好解决业务需求,而不是把大量精力来写系统应用组件,本文将结合本人在.NET2.0+C#开发数据库应用系统过程中的实践和大家一起探讨基于数据库分级流水码的动态树导航应用。关键词业务逻辑TREEVIEW分级流水码1背景介绍从事过C/S模式开发的程序员都清楚使用TREEVIEW是很方便也很实用的控件,但到了WEB开发要想实现一个类似的树导航,要在客户端编写大量的代码,使用过JAVA语言JSP+SERVLET开发MVC程序的人对这点是深有体会的,2002年,微软公司发布了4种ASP.NET服务器控件,用于为使用IE浏览器的用户提供更好的体验。这些服务器控件简称为IEWeb控件,其中包括MultiPage、TabStrip、Toolbar和TreeView。这些服务器控件通过提供用户熟悉的界面,增强了ASP.NETWEB页面。实践证明IEWEB的应用情况非常的好。在ASP.NET2.0中,将这些控件收归为内置控件。ASP.NET2.0中的TREEVIEW控件较以前的TREEVIEW,在各个方面都有了很大的改进。不仅可用来显示单击、展开的树中的数据,而且还增强了非常灵活的交互性功能。这些交互功能的实现应用时非常广泛的,TREEVIEW控件支持数据绑定。即允许通过数据绑定的方式,使得控件节点与XML、表格、关系数据等结构化数据建立紧密的联系。支持SiteMapDataSource,实现站点导航功能,具有在节点显示CheckBox控件功能,用户根据需要自定义外观和样式,根据不同的浏览器和设备,自适应地完成控件呈现,下面将介绍分级流水码的原理以及基于DATATABLE的数据源的动态TREEVIEW。2程序应用2.1分级流水码分级流水码的原理是数字根据位长、大小等关系建立起层次结构,以树为例,假设“00”,代表的是根节点,那么与这个树根节点相连的树枝都是以“00”开头的数字,“0001”,“0002”,“0003”,分别代表着这棵树根节点下的枝干“A”,“B”,“C”,以此类推以“A”,“B”,“C”为根的枝干或叶子(没有下级子节点的节点)的数字代码就是“000101”A-a1,“000102”A-a2,“000201”B-b1,,“000202”B-b2,,“000301”C-c1,,“000302”C-c2,最后形成的树结构如下:图2-1分级流水码示意图当然每一级的位数可以根据需要自己定义,这是非常灵活的,一般两位可以拥有100个子节点,为了统计和排序的方便可以这样,但如果对这方面没有特殊要求的话,可以无限增加,这又跟自己的程序算法有关系了,只要能够逻辑严谨的实现,可以自己定义规则,使用分级流水码的优点是便于对数据进行分类查询,比较XML文件为例,在XML文件中任意一级可以有相同的两个节点,例如,A,B两个节点下都有同名的节点C,那么我们在统计以C为关键字的查询时就会出现误差,如果使用分级流水码就可以很好的区分这点,因为每个节点代码本身就体现着它的传承关系,这样做非常的实用,当然,也有它的缺点,它显然没有XML语言那么方便,强大,但在一般的企业级系统应用中是可以满足需要的,所以使用分级流水码的结构作为导航树的实现是很有现实价值的。2.2动态树实现要实现动态树导航基本的条件有三条:一、是动态数据,二、动态刷新,三、深度递归。动态数据:也就是说数据时根据需要从数据库或XML文件中取出的,并且这些数据时可以在程序中根据需要增加、修改、删除的,当然这些数据可以存储在关系数据库中,也可以存在XML文件中,但原理是一样的,那就是要动态的控制数据。动态刷新:也就是要在数据增加、更新、删除后能够动态刷新树显示最新的数据结构,树结构反应的是后台的数据库或XML文件中最新的数据变化。深度递归:实现动态数据结构的核心算法就是递归算法,思路是查找每个节点看它是否有子节点,如果有则用TREEVIEW的提供的方法将其下级子节点加入到当前节点中,呈现到页面,如果没有说明当前节点是叶子节点,则返回。递归算法看起来简单,但要很好的理解和灵活的应用时需要一些实际锻炼的。下面将以本人最近做的单位数据维护为例介绍动态树应用:protectedvoidPage_Load(objectsender,EventArgse){if(!Page.IsPostBack){TreeTn(00,(TreeNode)null);//生成树算法根节点(00)A(0001)B(0002)C(0003)A-a1(000101)A-a2(000102)B-b1(000201)B-b2(000202)C-c1(000301)C-c2(000302)}}首先,在页面的Page_Load事件中判断判断是不是第一次访问该页面,如果是则开始执行生成树的操作,否则不执行,这样做的目的是避免每次页面刷新的时候都执行一次生成树的语句,最后结果是页面中生成了N个树,这样是不对的。调用TreeTn(stringpid,TreeNodetn)算法,生成动态树,pid是节点代码,tn是节点对象,这里的关键是TreeTn(stringpid,TreeNodetn)的递归调用。在数据库中预先定义了一个数据表company_tree,包括三个字段farther_id,node_name,node_id,分别存放该节点的父节点的代码,该节点的名称,节点的代码,然后从数据库中读出参数tn传递来的父节点代码,当然是从根节点“00”开始的,如果数据库表中没有事先录入根节点信息,则要在增加节点的程序代码中实现,具体的做法后面将介绍。publicvoidTreeTn(stringpid,TreeNodetn){stringselectSQL=Selectfarther_id,node_name,node_idfromcompany_treewherefarther_id='+pid+'orderbynode_idasc;DataSetmyds=OracleConnectCase.GetProjectTreeDs(selectSQL);DataTabledt=myds.Tables[0];for(inti=0;idt.Rows.Count;i++){//取出满足条件的每一行的值分别取出其中的node_id,node_name,为当前的树节点赋值。这里的node_name将显示树最终的呈现效果。TreeNodetmptn=newTreeNode();tmptn.Value=dt.Rows[i][node_id].ToString();tmptn.Text=dt.Rows[i][node_name].ToString();//tmptn.NavigateUrl=MMS_SortEdit.aspx?id=+dt.Rows[i][0].ToString()+;如果有导航链接页面则在此设置//tmptn.Target=frmright;if(tn==null){//递归调用算法this.TreeView1.Nodes.Add(tmptn);TreeTn(dt.Rows[i][node_id].ToString(),tmptn);}else{tn.ChildNodes.Add(tmptn);TreeTn(dt.Rows[i][node_id].ToString(),tmptn);}}}这段程序的结构还是非常清楚的,就是不断的判断节点的子节点,如果有则递归调用TreeTn(stringpid,TreeNodetn)算法,并将节点加入到当前节点的子节点中。效果如下图2-2所示:图2-2动态单位树效果图生成了树,下面就要涉及到树节点的增加、删除以及误删除后的恢复。增加节点:增加节点的原理当然是首先选中它要增加节点的父节点,也就是说挂在哪个枝干下的问题,然后是如何在数据库表中自动生成节点代码,当然节点的代码必须能体现预先定义的规则,能够反映树的层次结构,这样才是正确的。这里我给大家介绍一种本人自己的算法,我叫它填坑法:举例说明,假设菜地里预先种了20棵萝卜,如果其中几颗被拔走的情况下,如果将新萝卜种到拔走的萝卜坑中,该如何设计新种萝卜的代码,这是一种情况。另一种情况是所有的20棵萝卜都在的情况下要增加新的萝卜就要新挖坑,种萝卜。这个例子是说我们增加新的节点的时候可能会遇到两种情况一种情况是已有的节点中的某些节点被删除了,那么新增加的节点可以按照预定的规则填补空缺,这样做的好处是节省虚拟代码(两位的最多可以存100个子节点)。具体的算法如下:定义一个集合LIST用来存放待增加的节点同级的所有节点值,然后利用循环找出其中的“坑”,如果找到了也即是没有这个代码,则程序返回。System.Collections.Specialized.StringCollectionlist=newSystem.Collections.Specialized.StringCollection();//取出所有同级节点代码放入集合中for(intj=0;jdw4ds.Tables[0].Rows.Count;j++){list.Add(Convert.ToInt32(dw4ds.Tables[0].Rows[j][0].ToString().Substring(dw4ds.Tables[0].Rows[j][0].ToString().Length-2,2)).ToString());}//找到集合中的空缺位置,也就是待插入新节点的代码for(inti=1;i=99;i++){if(list.Contains(i.ToString())==false){nodeid=i.ToString();break;}}删除节点、恢复节点:删除节点和恢复节点都很简单,选中待删除的节点,同时用TREEVIEW的属性得到该节点的代码值,就可以删除了。恢复的目的是为了给误删除的操作提供恢复,方法是在每次删除节点的时候将节点的所以信息、父节点代码、节点名称、节点代码放入SESSION中保存,恢复操作就是取出SESSION中的值插入数据库。至此,基于分级流水码的动态树TREEVIEW就基本完成了。3总结树的应用在WEB系统开发中十分广泛,.NET提供的标准控件TREEVIEW大大的简化了程序框架开发的强度,为进入到WEB开发领域的初学者提供了非常好的工具,无需具备很强的程序设计能力就能写出非常好的程序框架,动态树之所以应用广泛是因为大部分的系统应用都是根据角色-权限划分的,系统需要对不同的角色划分不同的权限以保证数据的保密要求,同时也使系统更具人性化,总之,TREEVIEW的应用方法很多,要根据不同的需要选择是动态还是静态树,是选择XML文件还是数据库作为树的数据源,最恰当的选择是最好的选择,随着自身认识的深入经验的积累,会发现有更多更好的方法来解决具体的需要,程序员的道路永远在远方,只有不断的攀登才能跟上信息化发展的步伐,本文是本人在开发实践中根据自己的心得梳理的,有不尽严谨之处,希望得到大家的雅正。参考文献【1】刘端阳,汪杰ASP.NET网络开发实用工程案例人民邮电出版社2008.5第一版【2】郝刚,ASP.NET2.0开发指南2006.5第一版【3】DR.ShahramkhosraviASP.NET2.0服务器控件与组件开发高级编程2007.6第一版作者简介刘秀益48岁,1979年参加工作,现工作单位是克拉玛依钻井公司信息服务中心,担任克拉玛依钻井公司信息中心主任,从事过软件系统开发、网络设计、集成电路设计,熟悉

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功