Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从接口引发事件(win表单)_Vb.net_Winforms_Events_Interface_Event Handling - Fatal编程技术网

Vb.net 从接口引发事件(win表单)

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

我的设想:

带有基本主控形状(mdi)的Windows窗体应用程序

具有事件的接口:

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