Office中国论坛/Access中国论坛

标题: 【Access小品】先利其器 -- 通用TreeView加载程序 [打印本页]

作者: todaynew    时间: 2015-7-8 15:51
标题: 【Access小品】先利其器 -- 通用TreeView加载程序
  版友三个太阳同志写了一段TreeView加载的程序,程序处理中用On Error Resume Next来排除已经加载的相同数据,我对此做法颇不以为然。不以为然的原因在于容错的处理通常是在除非必要时当可用,对于简单而正常的逻辑,用容错处理方式总不是一个好习惯。不过三个太阳同志希望简化代码的初衷是值得赞赏的。

  TreeView控件是系统设计中最为常见的控件,因为其广泛的使用,使得在一个系统中常常需要处理很多的TreeView数据加载的问题。TreeView数据加载的代码本身并不复杂,但写起来比较繁琐。究其原因,在于数据源与加载代码耦合度过高,所以一树一程序。由这个原因出发我们就会明白,简化TreeView加载的关键,在于数据源与子程序之间要降低耦合度。降低耦合度的方法,就是采用注入参数的方式来构建我们需要的TreeView加载程序。

  要采取注入参数的方式,我们首先需要搞明白注入些什么样的参数。你可能觉得这很简单嘛,当然需要注入各级节点需要的数据源。可是问题的复杂性在于,每个TreeView的各级节点的数据源的规律并不是恒定的。它们可能来源于多个数据表,也可能仅仅来源于一个表,还可能来源于数组、集合等变量。由于这个复杂性的存在,就难以用一个放之四海而皆准子程序来处理TreeView的通用加载。我们就需要抽象出一些常见和常用的数据源类型,仅对它们来编写通用的程序。至于你能够或者你需要抽象出些什么类型,那是你开发程序的实际需要所决定的。

  所谓工欲善其事工欲善其事必先利其器,而利其器的方法是有讲究的。这个讲究在于处理的思路和方法要得当,得当的标准不主要在于一段代码的简化(如版友三个太阳同志所做的那样),而更多的在于代码的复用性高低。

示例:[attach]56782[/attach]

视图:
[attach]56783[/attach]

Office交流网开发的Access专用树控件免费下载-支持64位
http://www.office-cn.net/book/accesstree/5.html





作者: tmtony    时间: 2015-7-8 15:53
好作品!
作者: leonshi    时间: 2015-7-8 15:56
强者风范
作者: roych    时间: 2015-7-8 16:34
开始没特别留意他的例子,觉得似乎缺少了展开子节点的做法,便推荐他看看两个帖子。
后来再仔细一看,他简化的代码似乎存在逻辑错误。即,子节点没有从父节点里继承过来,而On Error Resume Next却偏偏避开了这个错误,于是便修改代码后回复了。
一般来说,这种情况,我比较推荐递归算法,写一个子函数随时调用即可,没必要一次性把所有节点加载完毕。特别是数据较多时,这可能不是一个较好的策略。
作者: 风中漫步    时间: 2015-7-8 16:56
呵呵,耦合无处不在啊
作者: nncchh    时间: 2015-7-20 15:00
学习学习,谢谢分享!
作者: nncchh    时间: 2015-7-20 15:00
学习学习,谢谢分享!
作者: cpxie    时间: 2015-7-23 06:59
学习啦  太强大了
作者: hunrybecky    时间: 2015-7-29 01:35
todaynew兄
我做了一个使用你这个通用TreeView加载树后并显示对应记录的窗体,代码比较冗长,你看看是否可以精简下,或者是否有更好的方法?
[attach]56967[/attach]
作者: todaynew    时间: 2015-7-29 14:31
hunrybecky 发表于 2015-7-29 01:35
todaynew兄
我做了一个使用你这个通用TreeView加载树后并显示对应记录的窗体,代码比较冗长,你看看是否可 ...

两句代码即可:
Private Sub TreeView0_NodeClick(ByVal Node As Object)
    Me.Child1.Form.Filter = Node.Tag
    Me.Child1.Form.FilterOn = True
End Sub
作者: hunrybecky    时间: 2015-7-29 17:06
本帖最后由 hunrybecky 于 2015-7-29 17:23 编辑
todaynew 发表于 2015-7-29 14:31
两句代码即可:
Private Sub TreeView0_NodeClick(ByVal Node As Object)
    Me.Child1.Form.Filter = ...

我开始也是这么写的,但是发现一个问题,就是单击节点的时候应该显示下级节点才对
如果直接这样写的话只显示的是本级节点。如图
[attach]56972[/attach]

我是希望直接修改原来的程序代码来达到效果,但是对树不了解,怎么修改都实现不了效果。
我下面的代码是可以实现,但是太冗长,而且不是使用 node.tag的,希望修改原来的tag来实现。

[attach]56973[/attach]
我试着替换TreeViewNodeRecursion2中的代码
n.Tag = idFieldName & "=" & rs.Fields(idFieldName).Value

n.Tag = ParentidFieldName & "=" & rs.Fields(ParentidFieldName).Value
发现返回的也达不到我的效果
我要的最终效果为(具体看我楼上的例子,只是想更简单点来通过修改TreeViewNodeRecursion2实现)
1.顶级节点显示所有数据
2.最底层节点只显示本层节点数据
3.其他层节点显示下级节点的数据。




作者: todaynew    时间: 2015-7-31 08:55
本帖最后由 todaynew 于 2015-7-31 09:09 编辑
hunrybecky 发表于 2015-7-29 17:06
我开始也是这么写的,但是发现一个问题,就是单击节点的时候应该显示下级节点才对
如果直接这样写的话只 ...

N.tag 中只改等号左侧,右侧不变嘛。   
可以加一个形参,以满足两种你 n.tag 的计算。
顶级节点的tag写作“true“可筛选全部数据。

关于最低层节点的需求违背思维逻辑。  (最后两层节点筛选结果一致,让人无法理解 )


作者: asklove    时间: 2015-7-31 16:30
收藏了!
作者: ithink2012    时间: 2015-9-23 18:03
快速学习
作者: 简约猫咪    时间: 2015-9-24 21:08
进行学习
作者: WFH6898    时间: 2015-11-17 10:43
强者啊
作者: fjh    时间: 2016-3-17 16:07
学习
作者: yhl091122    时间: 2016-4-4 15:16
学习
作者: pyh512    时间: 2016-5-19 21:24
记得印象在哪见过这东东,后面我想找,却怎么也找不到,今天有幸又在这里看到了谢谢了
作者: 李力军2    时间: 2016-7-30 15:12
加一分
作者: 飘过    时间: 2016-7-31 08:40
学习
作者: owen2016    时间: 2016-8-20 11:07
已经下载学习
作者: 灰太郎    时间: 2018-1-1 18:37
qqqqqqqqqq
作者: 灰太郎    时间: 2018-1-1 18:37
eeeeeeeeeeeeeeeeeeeeeeeeeee




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3