相关文章推荐

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
     
    推荐文章