将许多控制事件绑定到同一个处理程序,获取发送者
Posted
技术标签:
【中文标题】将许多控制事件绑定到同一个处理程序,获取发送者【英文标题】:Bind many control events to same handler, get sender 【发布时间】:2013-11-05 14:56:29 【问题描述】:我正在构建一个带有大量 TextBox 控件的表单 Access。他们每个人的GotFocus()
事件将完全相同:
Private Sub Text1_GotFocus()
Text1.BorderColor = RGB(100, 100, 255)
...
End Sub
Private Sub Text2_GotFocus()
Text2.BorderColor = RGB(100, 100, 255)
...
End Sub
'... ad infinitum
这自然是一场维护噩梦,从美学上讲,这是我不得不不断滚动过去的一大堆。我可以将BorderColor = RGB(100, 100, 255)
等扔到一个函数中,并让每个处理程序调用该函数,但我仍然为每个 TextBox 留下 3 行相同的块 - 将 LostFocus
和其他处理相同的事件扔进去,不管文本框,它变得很傻。
因此,明智的做法是拥有一个 AllTextBoxes_GotFocus()
方法,并让每个 TextBox 的 On Got Focus
事件指向该方法。不过有两个问题:
[Event Procedure]
(生成标准Private Sub Text1_GotFocus()
方法)和应用程序中的任何宏。这是……奇怪。考虑到宏有一个用于调用 VBA 函数的RunCode
选项,这似乎是一种奇怪的循环调用代码的方式,必须让控件调用宏来调用代码。当然有更好的方法(我认为宏只能在模块中调用函数,而不能在表单中调用)。
我不确定如何获取发送者,所以我可以设置适当的控件边框。 VB.NET 在其事件中传入发送者和事件参数:Private Sub Text1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)
,但 VBA 没有。
如何使用单个处理程序处理多个事件,并在处理程序中获取事件的发送者?
【问题讨论】:
请参阅此处了解在 VBA 中通常建议如何执行此操作:vbforums.com/showthread.php?235463-Control-array-in-VBA 【参考方案1】:这是我的做法,但知道这会覆盖任何自定义 GotFocus 事件
Private Sub Form_Load()
On Error Resume Next
Dim ctrl As Control
For Each ctrl In Me.Form.Controls
If ctrl.ControlType = acTextBox Then
ctrl.GotFocus = "=changeColor('" & ctrl.name & "',100,100,255)"
'For LostFocus
ctrl.LostFocus = "=changeColor('" & ctrl.name & "')"
End If
Next ctrl
End Sub
Function changeColor(field As String, Optional red AS Integer =0 ,green AS Integer =0,blue As Integer = 0)
Me.Form.Controls(field).BorderColor = RGB(red, green, blue)
End Function
【讨论】:
以上是关于将许多控制事件绑定到同一个处理程序,获取发送者的主要内容,如果未能解决你的问题,请参考以下文章