gpt4 book ai didi

vba - 如何有效地将 Access 表单中的切换按钮和文本框配对?

转载 作者:行者123 更新时间:2023-12-02 02:57:06 25 4
gpt4 key购买 nike

我知道标题有点困惑,所以让我尽可能说清楚。
在 Access 表单 (2010) 中,我有一组包含日期的文本字段。这些字段都是可选的,用户可以填写任意数量的日期。为了使其更加用户友好,我想将每个字段关联到一个切换按钮。然后我希望发生两件事:

当前事件:

  • 如果文本字段有值,则它是可见并且切换按钮与之关联的是按下
  • 如果文本字段为,则它不可见并且切换按钮未按下

点击切换按钮:

  • 如果与其关联的文本字段有一个值,则该字段将被清除(并且不可见)并且切换按钮将被取消按下;
  • 如果与其关联的文本字段为空,则焦点设置在它上面并按下切换按钮(如果在文本字段中输入了值,则保持这种状态,否则一切都会恢复原样,不可见且未按下)。

到目前为止,我已经完成了第一步,根据我在网上找到的一些示例设置了两个控件集合。所以,当加载表单时,我称之为:

  Private mcolGroupTxToggle As New Collection
Private mcolGroupBuToggle As New Collection

Private Sub InitializeCollections()
Dim ctl As Control

If mcolGroupTxToggle.Count = 0 Then
For Each ctl In Me.Controls
If ctl.Tag = "txtoggle" Then
mcolGroupTxToggle.Add ctl, ctl.Name
End If
Next ctl
Set ctl = Nothing
End If

If mcolGroupBuToggle.Count = 0 Then
For Each ctl In Me.Controls
If ctl.Tag = "butoggle" Then
mcolGroupBuToggle.Add ctl, ctl.Name
End If
Next ctl
Set ctl = Nothing
End If

End Sub

在 Form_Current 事件中,我称之为:

  Private Sub OnLoadToggles(mcol As Collection, pcol As Collection)
Dim ctl As Control
Dim btn As Control
Dim strBtn As String

For Each ctl In mcol
'Every button has the same name than the textbox + "b"
strBtn = ctl.Name & "b"

For Each btn In pcol
If btn.Name = strBtn Then
If IsNull(ctl) Then
ctl.Visible = False
btn.Value = False
Else
ctl.Visible = True
btn.Value = True
End If
End If
Next btn

Next ctl
Set ctl = Nothing

End Sub

到目前为止一切正常,但我不确定这是最好的方法,我想我需要在第 2 步中重复一些行。
在程序中区分文本框和按钮似乎很奇怪,我觉得应该事先完成,这样我就不必在每个程序中都这样做。我还觉得遍历每对控件(文本 + 按钮)而不是遍历两个集合中的每个控件会更好。

基本上,我想知道是否 (1) 更好和 (2) 可能有这样简单的东西:

Private Sub OnLoadToggles(Collection of pairs)
for each [pair of txt and btn]
if isnull(txt) Then
txt.visible = false
btn.value = false
else
...
end if
...

我的猜测是,我需要制作一个公共(public)子组件,在其中我根据它们的标签(我的表单中还有其他需要单独放置的控件)和名称设置按钮和文本字段对的集合,但是我不确定如何,我是 VBA 的初学者。

有什么建议吗?

-- 编辑第2步--

感谢 Andre 的回答,第二部分比我想象的要容易。我已经更新了我的 sample database .所以在点击事件上我称之为:

Private Sub ClickToggles()
Dim ctl As Control
Dim btn As Control
Dim strBtn As String
Dim strCtl As String

strBtn = Me.ActiveControl.Name
strCtl = Left(strBtn, Len(strBtn) - 1)
Set ctl = Me(strCtl)
Set btn = Me(strBtn)

If IsNull(ctl) Then
btn.Value = True
ctl.Visible = True
ctl.Enabled = True
ctl.SetFocus
Else
ctl.Value = ""
btn.Value = False
ctl.Visible = False
End If

End Sub

它并不完美,但它确实有效。此时清除数据可能不是一个好主意,因为可能会发生误点击。最好在保存表单和清除集合中不可见和/或禁用控件的值之前循环遍历文本框。我可能稍后再说。
我不得不在 .visible 属性旁边添加 .enabled 属性,因为在 lostfocus 事件中我收到一条错误消息,指出控件仍处于事件状态,因此无法使其不可见。

现在我更关心点击和失去焦点事件的数量。我宁愿有一些公共(public)功能和事件处理程序来处理它,但它对我来说太复杂了。当我对……所有事情了解更多时,我会回到它。

仍然欢迎大家提出建议 =) !

最佳答案

由于您的控制对无论如何都是按名称“配对”的,因此您不需要任何花哨的构造,甚至不需要第二个集合。只需直接通过名称寻址匹配控件即可。

与使用 If/Else 设置 bool 属性相比,通常更容易将变量分配给属性。

Private Sub OnLoadToggles(mcol As Collection)

Dim ctl As Control
Dim btn As Control
Dim strBtn As String
Dim bShowIt As Boolean

For Each ctl In mcol
'Every button has the same name than the textbox + "b"
strBtn = ctl.Name & "b"
' If you have the control name, you can get the control directly:
Set btn = Me(strBtn)

' Using a variable you don't need If/Else
bShowIt = Not IsNull(ctl.Value)

ctl.Visible = bShowIt
btn.Value = bShowIt

Next ctl

' Note: this is not necessary for local variables - they go automatically out of scope
Set ctl = Nothing

End Sub

关于vba - 如何有效地将 Access 表单中的切换按钮和文本框配对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48722137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com