Set*_*man 6 events user-controls delegates event-bubbling winforms
请阅读这篇文章.我有同样的问题,如本文所述,但我试图在VB.net而不是c#.
我很确定这样做我必须使用自定义事件.(我使用代码转换站点来了解自定义事件.)因此在IDE中键入以下内容时:
公共自定义事件AddRemoveAttendees As EventHandler
它扩展为以下代码段.
Public Custom Event AddRemoveAttendees As EventHandler
AddHandler(ByVal value As EventHandler)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
End RaiseEvent
End Event
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何处理它.直到今天,我从未听说过自定义事件.
我想要的底线是让按钮的click事件冒泡到用户控件的容器.我知道我可以包装自己的活动但我至少想在我走得更远之前了解自定义事件.
赛斯
要使用自定义事件来冒泡另一个控件的事件,您可以这样做:
Public Custom Event AddRemoveAttendees As EventHandler
AddHandler(ByVal value As EventHandler)
AddHandler _theButton.Click, value
End AddHandler
RemoveHandler(ByVal value As EventHandler)
RemoveHandler _theButton.Click, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
' no need to do anything in here since you will actually '
' not raise this event; it only acts as a "placeholder" for the '
' buttons click event '
End RaiseEvent
End Event
Run Code Online (Sandbox Code Playgroud)
在AddHandler和中,RemoveHandler您只是传播调用以将控件的Click事件附加或移除给定的事件处理程序.
为了扩展自定义事件的使用,下面是自定义事件的另一个示例实现:
Dim _handlers As New List(Of EventHandler)
Public Custom Event AddRemoveAttendees 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
Run Code Online (Sandbox Code Playgroud)
现在,如上所述,它除了常规事件声明之外几乎没有:
Public Event AddRemoveAttendees As EventHandler
Run Code Online (Sandbox Code Playgroud)
它提供了一种类似的机制,允许附加和删除事件处理程序,以及引发事件.Custom事件添加的内容是额外的控制级别; 你可以围绕添加,删除和引发事件编写一些代码,在这些代码中你可以强制执行规则,并调整会发生什么.例如,您可能希望限制附加到事件的事件处理程序的数量.为此,您可以更改AddHandler上面示例中的部分:
AddHandler(ByVal value As EventHandler)
If _handlers.Count < 8 Then
_handlers.Add(value)
End If
End AddHandler
Run Code Online (Sandbox Code Playgroud)
如果您不需要这种详细控件,我认为无需声明自定义事件.
如果你想要提到你提到的另一篇文章中的相同内容,这里是VB.NET的等价物:
Public Custom Event AddRemoveAttendees As EventHandler
AddHandler(ByVal value As EventHandler)
AddHandler SaveButton.Click, value
End AddHandler
RemoveHandler(ByVal value As EventHandler)
RemoveHandler SaveButton.Click, value
End RemoveHandler
End Event
Run Code Online (Sandbox Code Playgroud)
但我认为这不是一个好主意,因为sender事件的参数将是Button,而不是你的UserControl......
相反,您可以订阅Button.Click事件并引发您自己的事件(没有显式访问者)