【发布时间】:2015-07-03 20:18:33
【问题描述】:
在我的表单中,我需要检测焦点是否移至新控件。
我可以为整个表单执行此操作而不必为每个控件创建事件过程吗?
我试过这个,但它似乎没有触发。
Private Sub Form_SelectionChange()
MsgBox Screen.ActiveControl.Name
End Sub
【问题讨论】:
在我的表单中,我需要检测焦点是否移至新控件。
我可以为整个表单执行此操作而不必为每个控件创建事件过程吗?
我试过这个,但它似乎没有触发。
Private Sub Form_SelectionChange()
MsgBox Screen.ActiveControl.Name
End Sub
【问题讨论】:
是的,使用 WithEvents。这需要一点时间,而且文档很差,但最终可能会得到回报:
【讨论】:
这会在每个控件上创建一个事件(不完全符合您的要求),但它非常干净。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each control As Control In Controls
AddHandler control.Enter, AddressOf ControlReceivedFocus
Next
End Sub
Private Sub ControlReceivedFocus(sender As Object, e As EventArgs)
MessageBox.Show(sender.ToString())
End Sub
End Class
【讨论】:
addhandler,您必须在for each 语句中使用对父表单的引用。看到这个线程:social.msdn.microsoft.com/Forums/en-US/…
This thread has a solution 将onClick 事件动态添加到控件。事实证明,尽管您可以添加自己的事件,但您不能添加自己的事件并拥有正常的 control_click() 事件。只是你可以在运行时通过代码设置,可以任意命名(只要是函数)。
这样回答了我的问题:您可以动态地将onclick 事件添加到每个控件,而无需在 gui 中创建它们。如果您愿意,可以在 form_onload 中输入以下语法:
with Me.myControl
Me.myControl.OnEnter = "=SomeFunction()"
end with
下面是如何将.OnEnter 事件添加到每个文本框控件(只需从form_open 调用SetReportControls 方法:
Private Sub SetReportControls()
Dim ctrl As Control
For Each ctrl In Me.Controls
With ctrl
If TypeOf ctrl Is Access.TextBox Then
.OnEnter = "=ReportControl(false)"
End If
End With
Next
End Sub
Private Function ReportControl(Cancel As Integer)
msgbox Screen.ActiveControl.Name
End Function
【讨论】: