博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态载入数据的无刷新TreeView控件(1)
阅读量:5771 次
发布时间:2019-06-18

本文共 2562 字,大约阅读时间需要 8 分钟。

 上次我介绍过,。由于当时对于JavaScript的了解比较有限,加之又把主要的精力都focus到popup窗口本身的一些问题上去了,所以关于菜单的设计中还是有很多不合理的地方。后来因为需要又作了一个TreeView控件,不过由于需求变化大,被改得来结构相当的乱了,于是抽空重构一下,并把一些设计步骤记录下来,欢迎大家讨论并提意见。

    虽然使用脚本制作的TreeView已经有很多了,不过对于做自己的产品来说,要使用现成的控件是很困难的。首先要能免费授权,其次需要有自己所期望的所有功能,三需要代码清晰到能很快理解并修改。免费可能是最简的要求了,而功能和可修改性却就不容易了,所以最后自己实现一个反而更省事。微软的Microsoft.Web控件包里有个强大的TreeView,不过遗憾的是那个是后台数据邦定的,Expand或Collapse节点需要doPostBack操作:(。
    既然开始都说了,现成的TreeView很多了,那么这个TreeView就必须站在巨人的肩膀上了。首先图标资源就不用自己弄了emembarrassed.gif,从上弄了一套下来(下载它的一个试用版本,里面有所有的图标,不用在网页里去弄),本来这玩意儿到处都有,只是它太全了,足有10多套各种风格的emsmilep.gif
    制作这个菜单,最重要的有两点,数据结构和UI表现(当然还有操作,不过这是以前者为基础的)。TreeView的数据结构,其实和Menu那个非常的相似,一个Tree类,一个TreeNode类,然后相互组合嵌套就可以了。只是在显示上需要有个合理的子树缩进,略显比菜单麻烦,因为菜单都是相对Parent菜单条目定位。UI表现使用Table元素来做为菜单整体,每一行TR元素作为一个菜单条目。这都不是难点,而最困难的是子树的层次缩进,从目前我所看到的树控件来讲,都是使用类似递归的方式来生成树的层次线条。而由于我前不久做过一个Menu控件,所以非常希望能像Menu那样,子菜单缩紧只用关心父菜单条目,那样实现起来就简洁多了,于是我设计了这样一种新的菜单UI元素的摆放层次。
  TreeView-1.png
    R.A.D树控件是使用DIV元素来生成树的UI表现,通过嵌套DIV来实现子树,不过子树缩进做的比较郁闷,居然是用一大堆的图片来当作SPACE(因为用别的东西不好控制宽度)。我实现的TreeView中,每个Tree层次是完整独立的,子树作为一个整体潜入父TreeNode,缩进完全由菜单层次自动维护,就是说每个菜单项生成相同的HTML代码。
    Tree类的结构:

None.gif 
function Tree(attribute, style)
None.gif {
None.gif    
this.Extends(CollectionBase);
None.gif    
this.m_Nodes = 
this.m_InnerArray;
None.gif
None.gif    
this.m_ParentNode = 
null;
None.gif    
this.m_ActiveNode = 
null;
None.gif    
this.m_Element = 
null;
None.gif    
this.m_TreeType = TreeType.Normal;
None.gif    
this.m_TreeLevel = 0;
None.gif    
this.m_IsEventAttached = 
false;
None.gif    
this.m_Id = __GlobalTreeCache__.NewId();
None.gif    __GlobalTreeCache__[
this.m_Id] = 
this;
None.gif   
None.gif    
this.m_Attributes = attribute ? attribute : 
new TreeAttribute();
None.gif    
this.m_Styles = style ? style : 
new TreeStyle();   
None.gif
None.gif    
this.InsertAt = 
function(node, index)
None.gif    {
None.gif         
this.base.InsertAt.Call(
this, node, index);
None.gif         node.m_Tree = 
this;  
None.gif    };
None.gif       
None.gif    
this.toString = 
function()
None.gif    {
None.gif        
return '[class Tree]';
None.gif    };  
None.gif }
    这个结构中,m_TreeLevel是树的层次数,本来用我这种表格嵌套结构,不需要知道树中的层次也是可以的,可是如果不知道当前树的层次是不是Root层,不能正确地生成节点前的操作提示图标。__GlobalTreeCache__是一个全局Hash Table,原理可以参看 ,作用是为了快速检索TreeNode,而避免每次都去遍历整棵树。m_Attributes & m_Styles是设置TreeView属性和风格的类,在一个TreeView中只分别保持一份实例。
    TreeNodeBase类的结构(TreeNode的所有和UI相关的内容,在TreeNodeBase中生成):
None.gif 
function TreeNodeBase(text, action, icon, subtree)
None.gif {
None.gif    
this.m_Text = text;
None.gif    
this.m_Tooltip = ''; 
None.gif    
this.m_Atction = action;
None.gif    
if ( subtree )
None.gif    {
None.gif        subtree.m_ParentNode = 
this;
None.gif       
this.m_ChildTree = subtree;
None.gif    }
None.gif    
this.m_Tree = 
null
None.gif    
this.m_Icon = 
null;
None.gif    
this.m_IconPath = icon;
None.gif   
None.gif    
this.m_IsChildExpanded = 
false;
None.gif    
this.m_IsLazyLoad = 
false;
None.gif    
this.m_IsLoaded = 
false;
None.gif    
this.m_Checked = 
false;
None.gif    
this.m_Disabled = 
false;  
None.gif   
None.gif    
this.m_Element = 
null;
None.gif      
None.gif    
this.toString = 
function()
None.gif    {
None.gif        
return '[class TreeNodeBase]';
None.gif    };
None.gif }
    这个类比较清楚,每个属性的作用都一目了然,就不多说了。
    下一节讲TreeAttributes和TreeStyle类。
    注: , , 。
    

    . . .

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

你可能感兴趣的文章
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
DLA实现跨地域、跨实例的多AnalyticDB读写访问
查看>>
实时编辑
查看>>
KVO原理分析及使用进阶
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
Microsoft发布了Azure Bot Service和LUIS的GA版
查看>>
Google发布Puppeteer 1.0
查看>>
.NET开源现状
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
AMD改善Linux驱动,支持动态电源管理
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>
ChPlayer播放器的使用
查看>>
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>