Vb.net 从接口引发事件(win表单)
我的设想: 带有基本主控形状(mdi)的Windows窗体应用程序 具有事件的接口:Vb.net 从接口引发事件(win表单),vb.net,winforms,events,interface,event-handling,Vb.net,Winforms,Events,Interface,Event Handling,我的设想: 带有基本主控形状(mdi)的Windows窗体应用程序 具有事件的接口: Public Interface IDoSomething Event AddFilter() 模式弹出窗口实现界面和贴花事件: Public Class frmPopup Implements IDoSomething Public Event AddFilter() Implements IDoSomething.AddFilter 弹出窗口还包含触发事件的代码: RaiseEvent AddFil
Public Interface IDoSomething
Event AddFilter()
模式弹出窗口实现界面和贴花事件:
Public Class frmPopup Implements IDoSomething
Public Event AddFilter() Implements IDoSomething.AddFilter
弹出窗口还包含触发事件的代码:
RaiseEvent AddFilter()
基本主窗体包含发现和启动实现指定接口的弹出窗体的代码
应用程序中的表单启动弹出窗口(实现接口)并处理它触发的任何事件。因此,我在表格中有以下代码:
Public Class frmMyForm
Public WithEvents m_Popup As IDoSomething
Public Sub m_Popup_AddFilter() Handles m_Popup.AddFilter
MsgBox("I'm in")
End Sub
直到触发事件的阶段,代码都在工作。弹出窗口加载时没有任何问题,但当事件触发时,它似乎从地球表面掉落,并且没有被主窗体-frmMyForm拾取。我怀疑这可能与通过界面发现从基本主窗体启动弹出窗体的方式有关
附加代码-展开“基本主窗体包含发现和启动实现指定接口的弹出窗体的代码”:
使用弹出式表单的目的是将业务对象返回到使用事件打开它的表单。弹出表单接口(IDoSomething)继承了另一个接口-IBusinessObject选择器,该接口指定表单将返回业务对象
因此,基本主窗体中的函数是:
Public Function GetBusinessObjectUsingPopup(Of O, F As IBusinessObjectSelector)
(ByRef dicPropertyValues As Dictionary(Of String, Object),
Optional ByVal titleText As String = "")
As O Implements IBaseMasterForm.GetBusinessObjectUsingPopup
Dim objBusinessObjectSelector As IBusinessObjectSelector = GetPopup(Of F)(False)
objBusinessObjectSelector.InitialiseForm()
' Activate and show the dialog
If objBusinessObjectSelector.ShowPopup() <> Windows.Forms.DialogResult.OK Then
' The user cancelled the load, so just exit
Return Nothing
End If
GetBusinessObjectUsingPopup = CType(objBusinessObjectSelector.SelectedBusinessObject, O)
End Function
注意-GetInterfaces(Of F)()只是扫描程序集并返回实现所需接口的表单列表。一些验证已被截断,如果找到实现该接口的多个表单,则返回消息。关键部分是正确初始化m_弹出窗口。你还没说过什么。一些示例代码: 表格2:
Public Class Form2
Implements IDoSomething
Public Event AddFilter() Implements IDoSomething.AddFilter
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RaiseEvent AddFilter()
End Sub
End Class
Public Interface IDoSomething
Event AddFilter()
End Interface
表格1:
Public Class Form1
Private WithEvents mPopup As IDoSomething
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim f2 As New Form2
f2.Show(Me)
mPopup = f2
End Sub
Private Sub mPopup_AddFilter() Handles mPopup.AddFilter
MsgBox("yada")
End Sub
End Class
此代码中的mPopup=f2语句非常关键。感谢您的回复,我在上面添加了一些额外的代码,以尝试显示弹出窗口是如何启动的,希望它能让它更清晰。我仍然看不到您分配m_弹出窗口成员。只是为了在进展中向您更新,您关于分配m_弹出窗口的评论是有效的,并且没有返回到原始开幕表单的句柄来绑定事件。这是目前提出的一个错误,所以当我得到它,并实施一个修复,我会更新张贴和信用你。谢谢
Public Class Form1
Private WithEvents mPopup As IDoSomething
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim f2 As New Form2
f2.Show(Me)
mPopup = f2
End Sub
Private Sub mPopup_AddFilter() Handles mPopup.AddFilter
MsgBox("yada")
End Sub
End Class