如何在 Vb.Net 中引发第三方 DLL 事件

How to raise third party DLL event in Vb.Net

我已经将几个 vb6 组件迁移到 dot net,下面是对问题的详细解释。

我有一个引用第三方 FarPoint 控件的包装器控件。在包装器控件中,我正在引发如下事件。

'Declaration of the event
 Public Event ButtonClicked(ByVal Sender As System.Object, ByVal e As 
  AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent) 

 'implementation of the event

Private Sub sprSpread_ButtonClicked(sender As Object, e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent) Handles sprSpread.ButtonClicked
    RaiseEvent ButtonClicked(sender, e)
End Sub

所以上面提到的包装器控件在另一个组件中被引用(其他组件只是一个调用组件)

所以在调用组件中,我在表单上添加了包装器控件并生成了如下所示的 ButtonClicked 事件。

 Private Sub InstSpread1_ButtonClicked(Sender As Object, e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent) Handles InstSpread1.ButtonClicked

End Sub

我收到 "type AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent" 未定义”错误,我还需要在调用组件中引用 FarPoint 以消除此错误。

如何在调用组件中引发 ButtonClicked 事件而不在调用组件中引用 FarPoint?

如果我对问题的理解正确,问题是您使用第三方类型为 e 参数声明您的事件:

Public Event ButtonClicked(ByVal Sender As System.Object, ByVal e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent)

你应该做的是定义你自己的 class 继承 EventArgs:

Public Class ButtonClickedEventArgs
    Inherits EventArgs

    '...

End Class

然后将其用于您自己的活动。你可以这样做:

Public Event ButtonClicked(sender As System.Object, e As ButtonClickedEventArgs)

但你应该这样做:

Public Event ButtonClicked As EventHandler(Of ButtonClickedEventArgs)

在您自己的组件中,您应该完全实现事件模式。这意味着一个专门的方法来引发事件:

Protected Overridable Sub OnButtonClicked(e As ButtonClickedEventArgs)
    RaiseEvent ButtonClicked(Me, e)
End Sub

在第三方组件的事件处理程序中,您可以将收到的 AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent 对象中的数据复制到您自己的 ButtonClickedEventArgs 对象中。我不知道您需要什么属性,所以我将仅使用示例:

Private Sub sprSpread_ButtonClicked(sender As Object, e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent) Handles sprSpread.ButtonClicked
    Dim eventArgs As New ButtonClickedEventArgs

    With eventArgs
        .Name = e.Name
        .Number = e.Number
    End With

    OnButtonClicked(e)
End Sub

编辑:您也可以考虑向您自己的事件参数添加一个复制构造函数 class,这样如果您在多个地方使用复制代码,就不必多次编写复制代码,例如

Public Class ButtonClickedEventArgs
    Inherits EventArgs

    Public Sub New(e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent)
        Name = e.Name
        Number = e.Number
    End Sub

    '...

End Class

然后像这样发起你的活动:

Private Sub sprSpread_ButtonClicked(sender As Object, e As AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent) Handles sprSpread.ButtonClicked
    OnButtonClicked(New ButtonClickedEventArgs(e))
End Sub