在进行了更多研究后,我发现这个问题可能没有正确的答案,但我发现了 2 种方法,它们以我正在寻找的方式提供了解决方案。在这两种情况下,我都使用了一个控制器类,它负责处理来自我的主窗体的任何用户交互。
第一种方法利用了 DmitryBabich 的建议,将处理程序添加到对象并将其引用到我的控制器类的方法:
在表格 1 中:
Dim ctrl as new Controller(Me)
AddHandler Button1.Click, AddressOf ctrl.doSomething
控制器类:
Public Class Controller
Private myForm As Form1
Public Sub New(ByVal f As Form1)
myForm = f
End Sub
Public Sub doSomething(sender As Object, e As EventArgs)
MsgBox("Button clicked.")
End Sub
End Class
对于一个如此简单的示例,不需要将 Form1 的实例传递给控制器,但如果我也想访问其他控件元素的值,我可以使用这个实例来解决它们表格 1。
例如:
Public Sub doSomething(sender As Object, e As EventArgs)
MsgBox("You clicked the button, by the way: The value of TextField1 is " & myForm.TextField1.text)
End Sub
另一种方法几乎相同,只是控制器知道表单的所有相关用户控件对象并可以直接处理它们的事件,这意味着在主表单中我只需创建控制器的实例.然而,在控制器中,我必须在加载主窗体后立即将要访问的每个用户控件分配给它自己的变量:
在表格 1 中:
Dim ctrl as new Controller(Me)
控制器类:
Public Class Controller
WithEvents myForm As Form1
WithEvents button1 As Button
WithEvents button2 As Button
Public Sub New(ByVal f As Form1)
myForm = f
End Sub
Public Sub formLoad() Handles myForm.Load
button1 = myForm.Button1
button2 = myForm.Button2
End Sub
Private Sub b1Click() Handles button1.Click
MsgBox("You clicked button1!")
End Sub
Private Sub b2Click() Handles button2.Click
MsgBox("Button #2 was clicked!")
End Sub
End Class