在.net中创建自定义事件

问题描述:

我在vb.net中创建了一个控件。现在我想让该控件发送一些消息(触发一个名为recieve的事件),并且实现它的父应用程序必须创建一个名为recieve的偶数侦听器并相应地执行操作。在.net中创建自定义事件

+0

我不确定你的问题是什么? – kenny

+1

检查这个帖子http://*.com/questions/1080808/how-to-expose-and-raise-custom-events-for-a-vb-net-winforms-user-control –

Public Custom Event recieve As EventHandler 

    AddHandler(ByVal value As EventHandler) 
     _handlers.Add(value) 
    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 
     If _handlers.Contains(value) Then 
      _handlers.Remove(value) 
     End If 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
     For Each handler As EventHandler In _handlers 
      Try 
       handler.Invoke(sender, e) 
      Catch ex As Exception 
       Debug.WriteLine("Exception while invoking event handler: " & ex.ToString()) 
      End Try 
     Next 
    End RaiseEvent 
End Event 

然后,你可以通过你的代码输入

Dim raise As New System.EventArgs 
RaiseEvent recieve(sender, raise) 

任何地方引发事件。

+1

另外,你可以使用thge单行'公共事件接收为EventHandler'并实现与所有代码相同的效果减去异常处理。 –

+0

@手电子食品你能解释一下吗? –

+0

@AkhilKNambiar,看到我单独的答案。 –

在控件类必须声明一个公共事件

Class MyControl 

    Public Event MyReceivedEvent(ByVal AParameterIWantToSend As TheTypeOfThisParameter, ByVal AnotherParmeter As AnotherType, ...) 

    ... 

End Class 

而当你使用你的控制,你可能在XAML

< MyControl x:Name="MyControlName" MyReceivedEvent="AHandlerForThisEvent" ... /> 

或者代码挂钩事件:

AddHandler MyControlName.MyReceivedEvent, AddressOf AHandlerForThisEvent 

Rq 1:您的事件可能没有参数。 Rq2:处理程序可以具有相同的参数,或者如果您不关心其中的某些参数,则可以更少。让他们都成为一个好习惯。 Rq3:如果您不尊重事件的签名,您可以使用Delegates获得更干净的代码,并发出警告/错误。像

Public Delegate Sub MyReceivedHandler(ByVal NumberOfItemsReceived As Integer, ByVal QualityOfReception As String, ByRef ReceptionHandled As Boolean) 

,然后你

AddHandler MyControlName.MyReceivedEvent, New MyReveivedHandler(AddressOf AHandlerForThisEvent) 

挂钩处理程序如果声明了这个委托类型的事件,听众将不得不尊重事件处理程序的签名。

Public Event MyReceivedEvent As MyReceivedHandler 

RQ4:您可以使用ByRef参数的,正如在最近的一个例子,所以参数发送给听众,是可以改变的,而接下来的听众看到这个参数的更新值。

RQ5:你可以使用lambda作为事件侦听器,在简单的场景,像

AddHandler MyControlName.MyReceivedEvent, _ 
      New MyReceivedHandler(Sub(ByVal num As Integer , ByVal Q As String, ByRef RHandled As Boolean) _ 
          MessageBox.Show(" Message receiveived containing " & num & " items " & " of Quality : " & Q) 

这段代码和@ user1057768的答案做的事情没有多大关系。任何由事件处理程序抛出的异常都会通过OnReceive方法返回,因此您可以在该类或其他地方捕捉它们。

Class MyClass 
    Public Event Recieve As EventHandler 

    Protected Overridable Sub OnReceive(e As EventArgs) 
     RaiseEvent Receive(Me, e) 
    End Sub 
End Class 

你只需要使用一个Custom Event,如果你需要特殊的代码来处理或引发事件。