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

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

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

谢谢

【问题讨论】:

    标签: ms-access forms vba controls grouping


    【解决方案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 属性对这些控件执行不同的操作。

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 2020-05-24
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        相关资源
        最近更新 更多