TreeView 树形控件是一个非常有用的控件,尤其在用于展示多层级关系时它是最佳选择。Access 中并没有内置的树形控件,因此一般我们使用 MSCOMCTL.OCX 库中的 TreeView。
但自从 Windows 7 开始,不论是 Win8、Win10,MSCOMCTL.OCX 通用控件库中的控件就经常出现兼容性问题。即开发环境下的版本号和使用环境下的版本号,哪怕只有很小的差别,像 6.1.9834 和 6.1.9818 这样,都会出现异常不能使用。
MSComctlLib.TreeView 控件一般可能会遇到的兼容性问题有会以下两类:
不能响应键盘、鼠标事件。
可以正常加载数据到树控件,但不论是鼠标还是键盘,均无法触发相应的事件,比如在 NodeClick 事件中写了相应处理代码,但点击之后没有任何反应。
键盘、鼠标事件一触发就报错。
点击鼠标、按键,甚至鼠标在树控件上移动,事件可以响应,但一触发就报错,导致不能正常使用。
这些问题发生的频率非常高!尤其是当一些在实际中已经在用的 Access 程序来说,遇到实在让人火冒三丈,因为业务部门等着马上要用呢!这是在坑爹呢还是在坑爹呢!
为了解决 MSComctlLib.TreeView 控件的兼容性问题,我们开发了一个 Access 版的树形控件 UMVsoftRDPLib.TreeView,作为替代方案。
UMVsoftRDPLib.TreeView 采用 HTML + CSS + JavaScript 进行呈现,通过 WebBrowser 浏览器控件作为容器,以 Access VBA 进行接口实现。在接口上,最大程度的兼容 MSComctlLib.TreeView 的接口,让你可以很快上手,对于已有的代码,只需要少量的修改即可。
TreeView属性
BackColor
可读写Variant类型。指定树控件的背景颜色。可以是文本型的Hex颜色值,也可以是数字型的RGB颜色值。
BackPicture
可读写String类型。指定树控件的背景图片。可以使用相对路径,用点号指定当前目录。例如:= ".\Images\TreeViewBG.png"
FontName
可读写String类型。指定树控件的字体名称。缺省时默认使用“Microsoft YaHei”字体。
FontSize
可读写Integer类型。指定树控件的字号大小。缺省时默认使用10号字体。
ThemeName
可读写String类型。指定所使用的主题名称。
ShowCheckboxes
可读写Boolean类型。指定是否在节点前面显示复选框。
ShowIcons
可读写Boolean类型。指定是否在节点前面显示图标。
PathSeparator
可读写String类型。指定返回节点路径时使用的分隔符。缺省时默认为反斜杠“\”。
CheckChildNodes
可读写Boolean类型。指示当显示节点复选框时,勾选/取消勾选节点时,它的所有下级节点是否同步自动勾选/取消勾选。
SelectedNode
可读写Node类型。返回或指定当前被选中(获得焦点)的节点对象。
Nodes
只读Nodes类型。返回对Nodes集合及其相关属性的只读引用。
TreeView方法
CollapseAll
折叠所有节点。
ExpandAll
展开所有节点。
GetNodeFullPath
获取指定节点的完整路径。
NodeId - String类型。要获得其路径的节点的ID。
PathSeparator - String型。路径分隔符,缺省时默认为反斜杠“\”。
Reload
重新加载树控件到浏览器控件容器。
SetFocus
设置指定节点获得焦点。获得焦点的节点会自动高亮显示。
NodeId - String类型。要让其获得焦点的节点的ID。
RemoveFocus
移开焦点,所有节点均不获得焦点。
RaiseDoEvents
转移控制权。和调用DoEvents方法一样,用来在特别耗时的时候转移程序控制权,防止假死。
LoadToWebBrowser
将生成的树控件加载到浏览器控件容器。
WebBrowser - Object类型。浏览器控件容器对象。容器一般用 Me.WebBrowser1.Object 这样的语法引用。
LoadFromTable
根据一个结构符合要求的表(或查询)中的数据,自动生成树形节点。
TableName - String类型。数据表对象名称或查询对象名称。
NumberField - String类型。编号字段名称。
NumberLevelLegnth - Long类型。每级编号的长度是几位数。
TextField - String类型。用来作为节点文本的字段名称。
RootText - String类型。根节点的节点文本。
说明:表中必须有一个文本类型的编号字段,和一个用来显示节点文本的字段。每一级编号的长度固定。
编号示例:
00010001
00010002
00020001
窗体中添加WebBrowser控件(浏览器控件)作为容器。然后通过代码使用此TreeView控件:
具体实例可参考平台的SysFrmMain窗体中导航菜单的使用。
Public WithEvents mclsTree As UMVsoftRDPLib.TreeView '声明模块级树控件对象变量,WithEvents关键字指示允许该对象触发事件,注意这里WithEvents不能和New同时使用。
Private Sub Form_Load()
Set mclsTree = NewTreeView() '因为Access的限制,这里只能使用NewTreeView函数来对树控件进行实例化。
With mclsTree
.ShowIcons = True '显示图标
.ShowCheckboxes = True '显示复选框
.BackColor = "#FFFFFF" '背景色为白色
.FontName = "Microsoft YaHei" '使用微软雅黑字体
.FontSize = 10 '使用10号字体
.Nodes.Clear '初始化清空所有节点
.Nodes.Add , "K", "商品分类" '创建根节点
End With
'方法一:常规加载节点方式
Dim strSQL AS String
Dim rst As Object
strSQL = "SELECT * FROM 商品分类表 ORDER BY 分类编号"
Set rst = CurrentDb.OpenRecordset(strSQL)
Do Until rst.EOF
With mclsTree.Nodes.Add("K" & Left(rst!分类编号, Len(rst!分类编号) - 4), "K" & rst!分类编号)
.Text = Trim(Nz(rst!分类名称))
End With
rst.MoveNext
rst.Close
'方法二:快捷加载节点方式
mclsTree.LoadFromTable "商品信息表", "分类编号", 4, "分类名称", "(商品分类)"
'注意,方法一和方法二只选其中一种使用即可。
mclsTree.LoadToWebBrowser Me.ocxTreeMenu.Object '将树控件载入容器进行显示。
End Sub
Private Sub mclsTree_NodeClick(Node As UMVsoftRDPLib.Node)
MsgBox "你点击的节点是" & Node.Text
End Sub
Private Sub mclsTree_NodeDblClick(Node As UMVsoftRDPLib.Node)
MsgBox "你双击的节点是" & Node.Text
End Sub