且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

动态载入数据的无刷新TreeView控件(2)

更新时间:2021-12-25 04:56:45

昨天说了一下TreeView控件的数据结构和UI表现的设计。为了让一个TreeView控件有更好的实用性,对它的功能和外观作一些必要的定制是非常有用的,今天就来说一下关于定制这个TreeView相关的一些设计。因为这些东西在一开始编码后就会马上被使用到,先确定好能省不少事。

    目前设计了3个辅助TreeView的类,它们分别是:

    
Class Name Description
TreeType 表明树的类型,特殊类型有的地方要特殊处理
TreeStyle 树的外观定制的一些属性和方法
TreeAttribute 树的功能定制的一些属性和方法


    还有一个全局Object实例__GlobalTreeCache__,用来cache所有的Tree和TreeNode的实例,作用是用来快速的定位制定的TreeNode,特别在异步动态Load子树时非常的有用。

    TreeType设计成一个static的类,不能实例化,当然它更像是一个enum。

    TreeStyle和TreeAttribute的结构和使用都相同,分开只是为了逻辑上面更加的清晰。这两个类的实现非常简单,就是在其内部定义很多的属性条目就行了。这里有问题的是怎么把这两个内的实例应用到TreeView的实例上去。有两个方法来做这个事情,如果我们不怕麻烦,就先分别生成一个TreeStyle和TreeAttribute的实例,然后再分别赋值给Tree和TreeNode。第二是让Tree和TreeNode内部自动维护这个TreeStyle和TreeAttribute,目前的实现采用的第二种方法,因为这样似乎是TreeView的使用更加简洁。
动态载入数据的无刷新TreeView控件(2) function Tree(attribute, style)
动态载入数据的无刷新TreeView控件(2) {
动态载入数据的无刷新TreeView控件(2)    // . . .
动态载入数据的无刷新TreeView控件(2)
   
动态载入数据的无刷新TreeView控件(2)    this.m_Attributes = attribute ? attribute : new TreeAttribute();
动态载入数据的无刷新TreeView控件(2)    this.m_Styles = style ? style : new TreeStyle();   
动态载入数据的无刷新TreeView控件(2) }

    用户不用去关心TreeStyle和TreeAttribute的生成,然后整棵树共享第一次初始化时生成的TreeStyle和TreeAttribute实例。不过必须注意的是,以后对子树的初始化需要赋给attribute和style参数,否这子树就会生成自己的TreeStyle和TreeAttribute实例动态载入数据的无刷新TreeView控件(2)。这个地方有点矛盾,如果要让控件使用方便,就有可能生成冗余对象;否这就需要手动创建并手动赋值attribute和style。

    对了,为什么不生成全局变量TreeStyle和TreeAttribute实例呢?那样一个页面的多棵树就不能apply不同的风格了:(

    附TreeStyle和TreeAttribute代码(还会根据接下来的开发扩充这两个类):
动态载入数据的无刷新TreeView控件(2) function TreeStyle()
动态载入数据的无刷新TreeView控件(2) {
动态载入数据的无刷新TreeView控件(2)
动态载入数据的无刷新TreeView控件(2)    this.toString = function()
动态载入数据的无刷新TreeView控件(2)    {
动态载入数据的无刷新TreeView控件(2)        return '[class TreeStyle]';
动态载入数据的无刷新TreeView控件(2)    };  
动态载入数据的无刷新TreeView控件(2) }
动态载入数据的无刷新TreeView控件(2)
动态载入数据的无刷新TreeView控件(2) TreeStyle.OpIcon = function(image)
动态载入数据的无刷新TreeView控件(2) {
动态载入数据的无刷新TreeView控件(2)    return 'Skins/default/' + image + '.gif';
动态载入数据的无刷新TreeView控件(2) };
动态载入数据的无刷新TreeView控件(2)
动态载入数据的无刷新TreeView控件(2) TreeStyle.Icon = function(icon)
动态载入数据的无刷新TreeView控件(2) {
动态载入数据的无刷新TreeView控件(2)    if ( !icon )
动态载入数据的无刷新TreeView控件(2)    {
动态载入数据的无刷新TreeView控件(2)         icon = 'default.gif';
动态载入数据的无刷新TreeView控件(2)    }
动态载入数据的无刷新TreeView控件(2)    if ( icon.indexOf('.') == -1 )
动态载入数据的无刷新TreeView控件(2)    {
动态载入数据的无刷新TreeView控件(2)         icon += '.gif';
动态载入数据的无刷新TreeView控件(2)    }
动态载入数据的无刷新TreeView控件(2)    return 'Skins/' + icon;
动态载入数据的无刷新TreeView控件(2) };
动态载入数据的无刷新TreeView控件(2)
动态载入数据的无刷新TreeView控件(2) function TreeAttribute()
动态载入数据的无刷新TreeView控件(2) {
动态载入数据的无刷新TreeView控件(2)    this.m_TextIndent = 2;
动态载入数据的无刷新TreeView控件(2)    this.m_HasCheckBox = true
动态载入数据的无刷新TreeView控件(2)
动态载入数据的无刷新TreeView控件(2)    this.toString = function()
动态载入数据的无刷新TreeView控件(2)    {
动态载入数据的无刷新TreeView控件(2)        return '[class TreeAttribute]';
动态载入数据的无刷新TreeView控件(2)    };  
动态载入数据的无刷新TreeView控件(2) }

    to be continued ...


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