如果我理解正确,你有...
- FormA 创建 FormB。
- FormB 创建 UserControlB。
- UserControlB 引发“OK”事件。
- FormB 收到“OK”事件。
...但您需要额外的步骤:
- FormA 收到“OK”事件。
这里的问题是 FormA 没有对 UserControlB 的引用,因为 FormB 是创建 UserControl 的那个。另一个问题是 FormB 可能不知道 FormA 是谁(取决于您如何设置它)。
选项 1 - 通过参考
如果您希望 FormB 和 FormA 都响应单个“OK”事件(由 UserControl 生成),那么您必须以某种方式在同一位置引用所有三个玩家,以便可以正确连接事件. 执行此操作的逻辑位置将在 FormB 中,因为这是创建 UserControl 的位置。然而,为了方便起见,您必须修改 FormB 以便对 FormA 的引用以某种方式传递给它。然后,当 FormB 创建其 UserControlB 实例时,您可以将“OK”事件直接连接到 FormA 中的处理程序:
Public Class FormA
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim frmB As New FormB(Me) ' pass reference to FormA into FormB via "Me" and the Constructor of FormB
frmB.Show()
End Sub
Public Sub ucB_OKEvent()
' ... do something in here ...
Debug.Print("OK Event received in FormA")
End Sub
End Class
Public Class FormB
Private _frmA As FormA
Public Sub New(ByVal frmA As FormA)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
_frmA = frmA ' store reference to FormA so we can use it later
End Sub
Private Sub FormB_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ucB As New UserControlB
ucB.Location = New Point(10, 10)
AddHandler ucB.OKEvent, AddressOf _frmA.ucB_OKEvent ' wire up the "OK" event DIRECTLY to the handler in our stored reference of FormA
Me.Controls.Add(ucB)
End Sub
End Class
Public Class UserControlB
Public Event OKEvent()
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
RaiseEvent OKEvent()
End Sub
End Class
选项 2 - “冒泡”事件
另一种选择是将事件从FormB“冒泡”到FormA。在这种情况下,FormB 将不知道 FormA 是谁,因此不会传递任何引用。相反,FormB 将拥有自己的“OK”事件,以响应从 UserControlB 接收原始“OK”事件而引发。FormA 将从 UserControl 获得“OK”通知,而不是直接:
Public Class FormA
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim frmB As New FormB
AddHandler frmB.OKEvent, AddressOf frmB_OKEvent
frmB.Show()
End Sub
Private Sub frmB_OKEvent()
' ... do something in here ...
Debug.Print("OK Event received from FormB in FormA")
End Sub
End Class
Public Class FormB
Public Event OKEvent()
Private Sub FormB_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ucB As New UserControlB
ucB.Location = New Point(10, 10)
AddHandler ucB.OKEvent, AddressOf ucB_OKEvent
Me.Controls.Add(ucB)
End Sub
Private Sub ucB_OKEvent()
Debug.Print("OK Event received from UserControl in FormB")
RaiseEvent OKEvent()
End Sub
End Class
Public Class UserControlB
Public Event OKEvent()
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
RaiseEvent OKEvent()
End Sub
End Class
设计决策
你必须在这里做出设计决定。谁是“OK”事件的来源?它应该是 UserControl 还是 FormB?UserControl 会以不同的形式(FormB 除外)使用吗?FormB 会与 FormA 以外的表单一起使用吗?这些答案可能会帮助您决定哪种方法更好……或者可能会导致您重新考虑如何设计当前的解决方案;你可能需要完全改变它。