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类型。根节点的节点文本。 说明:表中必须有一个文本类型的编号字段,和一个用来显示节点文本的字段。每一级编号的长度固定。 编号示例: 0001 00010001 00010002 0002 00020001 |
TreeView事件
名称 | 说明 |
---|---|
NodeCheck | 节点复选框选择事件。当ShowCheckboxes属性设为True时,对节点前的复选框勾选/取消勾选时触发该事件。 |
NodeClick | 节点单击事件。 |
NodeDblClick | 节点双击事件。 |
Nodes属性
名称 | 说明 |
---|---|
Item | 只读Variant类型。根据索引或键值返回Nodes集合中的指定节点对象。 参数: IndexKey - 指定节点的索引或键值。 |
Count | 只读Long类型。返回Nodes集合中所有节点的个数。 |
Nodes方法
名称 | 说明 |
---|---|
Add | 添加节点。 参数: ParentKey - 父节点键值。 Key - 节点键值。 Text - 节点文本。 Tag - 额外的标记文本。 Icon - 节点图标名称。 ForeColor - 节点字体颜色。 BackColor - 节点背景色。 FontBold - 字体是否加粗。 Expanded - 节点是否展开显示子节点。 Checked - 节点前的复选框是否勾选。 |
Remove | 移除指定节点。 参数: IndexKey - 要删除的节点的索引或键值。 |
Clear | 清空所有节点。 |
Node属性
名称 | 说明 |
---|---|
Index | 只读Long类型。节点的索引。 |
Key | 可读写String类型。返回或设置节点的唯一键值。 |
ParentKey | 可读写String类型。返回或设置节点的父节点的唯一键值。 |
Text | 可读写String类型。返回或设置节点的显示文本。 |
Icon | 可读写String类型。返回或设置节点的图标。图标必须是当前目录下 Images\Icons子目录中的文件。 |
Checked | 可读写Boolean类型。返回或设置节点前的复选框是否被勾选。 |
Expanded | 可读写Boolean类型。返回或设置是否展开节点以显示其子节点(如果有)。 |
ForeColor | 可读写String类型。返回或设置节点的字体颜色。 |
BackColor | 可读写String类型。返回或设置节点的背景颜色。 |
FontBold | 可读写Boolean类型。返回或设置节点字体是否加粗。 |
Tag | 可读写String类型。返回或设置节点上额外存储的信息。 |
示例
窗体中添加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 Loop 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
修订记录
- 2018-08-31 2.0.0 版本加入
- 2019-07-10 2.5.1 版本修正 Icon 属性指定图标时,如果包含子目录路径,则图标无法显示的问题。