在 Access 表单上将控件分组在一起

Posted

技术标签:

【中文标题】在 Access 表单上将控件分组在一起【英文标题】:Grouping controls together on an Access form 【发布时间】:2010-12-12 07:35:38 【问题描述】:

我有一个 Access2003 表单,我想通过 VBA 代码将多个控件组合在一起并以编程方式更改可见性。

这可能吗?我知道我可以通过 Format -> Group 对项目进行分组,但如果这样做,我如何在我的代码中引用整个组?

谢谢

【问题讨论】:

【参考方案1】:

您可以将所有控件放在一个组合框控件中,然后更改组合框本身的可见性。

您还可以在要分组的每个控件的标记属性中添加一个值,然后在 VBA 中循环遍历该控件并检查该值并更改那里的可见性。

将所有要分组的控件的标签属性设置为 groupABC 或任何你想要的。

然后在您的代码中的某处使用它来循环表单控件并检查它。

Dim ctrl As Control
For Each ctrl In Me.Controls
    If ctrl.Tag = "groupABC" Then
        ctrl.Visible = False
    End If
Next

【讨论】:

你能告诉我怎么做吗?我是 vba 的新手,我不知道应该怎么做。 我建议为此使用自定义集合,因为它比遍历整个 Controls 集合并测试每个控件的 .Tag 属性要快得多。 "您可以将所有控件放在一个组合框控件中" Access 没有组合框控件。【参考方案2】:

要详细说明我对使用自定义集合的评论,您可以在表单的模块中执行以下操作:

  Private mcolGroupABC As New Collection

  Private Sub IntializeCollections()
    Dim ctl As Control

    If mcolGroupABC.Count = 0 Then
       For Each ctl in Me.Controls
         If ctl.Tag = "GroupABC" Then
            mcolGroupABC.Add ctl, ctl.Name
         End If
       Next ctl
       Set ctl = Nothing
    End If
  End Sub

  Private Sub Form_Load()
    Call InitializeCollections
  End Sub

  Private Sub ShowControls(mcol As Collection, bolShow As Boolean)
    Dim ctl As Control

    For Each ctl In mcol
      ctl.Visible = bolShow
    Next ctl
    Set ctl = Nothing
  End Sub

要隐藏控件,您可以这样做:

  Call ShowControls(mcolGroupABC, False)

并向他们展示:

  Call ShowControls(mcolGroupABC, True)

这很简单,不是吗?

这是我一直在我的应用程序中使用的那种代码,我从大约 10 年前第一次实现它开始就一直在使用它,并注意到它的显示/隐藏速度明显更快与遍历整个 Controls 集合相比,使用自定义集合的控件。

唯一需要注意的是,如果其中一个控件具有焦点,如果您尝试隐藏它,它将出错。这很容易解决,因为如果您要隐藏一组控件,那么在您这样做之前,您肯定有一个合适的位置来设置焦点。

【讨论】:

您是否注意到即使在控件数量较少的表单上也能提高性能?这看起来是一种很好的处理方式,尤其是在您经常隐藏/显示控件的情况下。 无论如何我都喜欢使用相同方法的优雅。这并不是说我从来没有走过 Controls 集合——这完全取决于我是在每个表单实例中执行一次,还是重复执行(例如,在 OnCurrent 事件中)。如果是后者,那么即使在具有少量控件的表单上,自定义集合方法也更胜一筹,这不是因为速度问题,而是因为它只是一种更好的方法。当然,我不建议过火!【参考方案3】:

我喜欢 Joel Gauvreau 建议的 tag 属性。其他可能性包括选项卡控件和/或子表单。

【讨论】:

【参考方案4】:

更有效的方法是将所有相关控件添加到选项卡控件。您创建一个带有单个 Page 的 Tab 控件,然后将 Tab 控件 Style 设置为 None 并将 Back Style 设置为 Transparent。这样,Tab 控件的视觉外观就会消失,但它的分组语义仍然存在。然后将控件添加到页面,在内部创建它们或将现有控件剪切+粘贴到页面中(记住在粘贴后重新启用事件过程)。

如果只是可见性问题,现在您只需设置 Page 控件的Visible 属性,属于它的所有控件都会显示或隐藏。

但是,如果您需要对每个分组控件进行更精细的处理,您可以使用以下方法遍历它们:

  Dim ctl As control
  
  For Each ctl In page_control.Controls
     ctl.Visible = False
  Next

您还可以使用 .Tag 或 .Type 属性对这些控件执行不同的操作。

【讨论】:

以上是关于在 Access 表单上将控件分组在一起的主要内容,如果未能解决你的问题,请参考以下文章

MS Access vba中的分组字段

如何在 MS Access VBA 上将文本框注释值输入设置为表格数据插入

Access 2013 vba - 清除表单的控件,绕过计算的控件

使用组合框过滤子表单 - ACCESS 2013

Access 2016 表单控件验证规则未触发

MS Access = 引用子表单中的控件