在 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 上将文本框注释值输入设置为表格数据插入