Как вызвать стороннее событие DLL в Vb.Net - PullRequest
0 голосов
/ 09 октября 2018

Я перенес несколько компонентов vb6 в точечную сеть, и ниже приведено подробное объяснение этой проблемы.

У меня есть элемент-оболочка, который ссылается на сторонний элемент управления 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

Я получаю сообщение об ошибке «Тип AxFPSpreadADO._DSpreadEvents_ButtonClickedEvent» не определен, и мне необходимо обратиться к FarPointа также в вызывающем компоненте, чтобы избавиться от этой ошибки.

Как вызвать событие ButtonClicked в вызывающем компоненте, не ссылаясь на FarPoint в вызывающем компоненте?

1 Ответ

0 голосов
/ 09 октября 2018

Если я правильно понимаю вопрос, проблема в том, что вы объявляете свое мероприятие сторонним типом для параметра e:

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

Что вы должны сделать, это определитьваш собственный класс, который наследует 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

РЕДАКТИРОВАТЬ: Вы также можете рассмотреть возможность добавления конструктора копирования в свой собственный класс аргументов событий, так что у вас не будетнаписать код копирования более одного раза, если вы используете его в нескольких местах, например,

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
...