动态地生成树兼谈“见光标志位”

Technorati 标签: , treeview, 生成树, 动态, 分层, 见过光

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明

作者:xixi

出处:http://blog.csdn.net/slowgrace/archive/2008/12/09/3483683.aspx 

所谓“动态地生成树”是指,不一次把树上所有节点都add上,而是每次只生成头几层(比如3层)节点,更下层的节点等到用户点击的时候再生成。这样做可以防止树生成得太慢,而且只生成用户用到的节点也节省了资源。

1.最初生成几层节点好?

那么一次生成几层节点好呢?3层:自己、自己的孩子、自己的孩子的孩子(孙子)。这样当前节点的孩子节点前的+/-号能正确显示,于是用户能清楚地看到当前节点有几个孩子,孩子们是否还有孩子,这和生成完整树的效果是一样的。或者说,为了确保每个已显示的节点的加减号显示正确,所有已显示的节点的孩子节点要提前生成出来。

2.何时生成余下的节点?

当用户点击未生成孙子节点的节点的时候。

3.如何判断一个节点的孙子节点不存在?

在生成树节点的时候给节点的key加上标志位,标志它的儿子节点是否已生成。当用户点击一个节点导致expand事件发生时,在事件处理代码中读该节点的孩子节点的标志位,如果标识孩子节点的孩子还未生成,就表明当前节点的孙子节点不存在。

4.能否详细谈一下这个标志位?

这篇文章里提到我们对树节点的tag的设计。这个标志位是由程序设置和维护的,每个已生成孩子节点的节点的这个标志位为Y,实际上所有标志为“Y”的节点也都是“见过光”的节点。所谓“见过光”是指被用户看到过(包括那些用户看过又点击折叠按钮隐藏起来)的节点,这些节点既然被看到过,就得保证它的加减号显示正确,因此就得保证它的儿子都生成出来了。所以,“见过光”等同于“生孩子”,呵呵。我们不妨称这个标志位为“见光标志位”(或称“生子标志位”也行,嘿嘿)。

5.如何做到起初生成节点的时候只生成3层?这篇文章里生成树是递归的呀?

在那个递归调用的参数里加个层数,每次调用的时候把那个层数减1,减到0的时候就退出递归调用。

6.这办法不错,给个示例代码如何?

看过来呀看过来。生成树的主代码:

用于递归调用的函数:

7.没看出你设置标志位呀

在上面省略的代码里,bytlevel>1的时候,标志位就设为Y;否则(也就是=1的时候,因为小于1的时候递归就结束了),标志位就设为N,这次递归生成的节点不再继续生成其儿子节点,没生孩子的节点当然标志位为N了。

8.动态生成余下的节点给个代码吧

这个工作在expand事件过程里做 

上面的IsNodeExposed函数用来判断这个节点的标志位是否为Y;SetNodeExposedFlag节点则把相应的标志位设为Y。因为这些节点都要生孩子了,所以设为Y;又因为只生成孩子一层、不生孙子,所以调用层数是1,呵呵。

更多树类文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值