在.net中创建自定义事件
我在vb.net中创建了一个控件。现在我想让该控件发送一些消息(触发一个名为recieve的事件),并且实现它的父应用程序必须创建一个名为recieve的偶数侦听器并相应地执行操作。在.net中创建自定义事件
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)
任何地方引发事件。
另外,你可以使用thge单行'公共事件接收为EventHandler'并实现与所有代码相同的效果减去异常处理。 –
@手电子食品你能解释一下吗? –
@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
,如果你需要特殊的代码来处理或引发事件。
我不确定你的问题是什么? – kenny
检查这个帖子http://*.com/questions/1080808/how-to-expose-and-raise-custom-events-for-a-vb-net-winforms-user-control –