设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 8324|回复: 23
打印 上一主题 下一主题

[模块/函数] 【Access小品】先利其器 -- 通用TreeView加载程序

[复制链接]
跳转到指定楼层
1#
发表于 2015-7-8 15:51:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  版友三个太阳同志写了一段TreeView加载的程序,程序处理中用On Error Resume Next来排除已经加载的相同数据,我对此做法颇不以为然。不以为然的原因在于容错的处理通常是在除非必要时当可用,对于简单而正常的逻辑,用容错处理方式总不是一个好习惯。不过三个太阳同志希望简化代码的初衷是值得赞赏的。

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

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

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

示例:

视图:


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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享分享 分享淘帖1 订阅订阅

点击这里给我发消息

2#
发表于 2015-7-8 15:53:11 | 只看该作者
好作品!
回复

使用道具 举报

3#
发表于 2015-7-8 15:56:33 | 只看该作者
强者风范
回复

使用道具 举报

4#
发表于 2015-7-8 16:34:30 | 只看该作者
开始没特别留意他的例子,觉得似乎缺少了展开子节点的做法,便推荐他看看两个帖子。
后来再仔细一看,他简化的代码似乎存在逻辑错误。即,子节点没有从父节点里继承过来,而On Error Resume Next却偏偏避开了这个错误,于是便修改代码后回复了。
一般来说,这种情况,我比较推荐递归算法,写一个子函数随时调用即可,没必要一次性把所有节点加载完毕。特别是数据较多时,这可能不是一个较好的策略。
5#
发表于 2015-7-8 16:56:02 | 只看该作者
呵呵,耦合无处不在啊
6#
发表于 2015-7-20 15:00:32 | 只看该作者
学习学习,谢谢分享!
7#
发表于 2015-7-20 15:00:43 | 只看该作者
学习学习,谢谢分享!

点击这里给我发消息

8#
发表于 2015-7-23 06:59:44 | 只看该作者
学习啦  太强大了
9#
发表于 2015-7-29 01:35:26 | 只看该作者
todaynew兄
我做了一个使用你这个通用TreeView加载树后并显示对应记录的窗体,代码比较冗长,你看看是否可以精简下,或者是否有更好的方法?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
10#
 楼主| 发表于 2015-7-29 14:31:12 | 只看该作者
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-20 15:05 , Processed in 0.117409 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表