如何为 VB.NET WinForms 用户控件公开和引发自定义事件

6
请阅读此文章:THIS。我遇到了与该文章中描述的相同的问题,但我正在尝试在VB.net中解决它。
我很确定要做到这一点,我必须使用自定义事件。(我使用代码转换网站来了解自定义事件。)因此,在IDE中当我键入以下内容时:
Public Custom Event 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

但我不知道该怎么处理它。直到今天,我从来没有听说过自定义事件。

我的底线是希望将按钮的点击事件冒泡到用户控件的容器中。我知道我可以包装自己的事件,但在我深入研究之前,至少应该了解自定义事件。

Seth

2个回答

8

要使用自定义事件来冒泡另一个控件的事件,您可以按照以下方式进行:

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

AddHandlerRemoveHandler中,你只需将调用传播到控件的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

现在,就像上面看到的那样,它做得不比常规事件声明多。
Public Event AddRemoveAttendees As EventHandler

它提供了类似的机制,允许附加和删除事件处理程序,并引发事件。自定义事件添加的是额外的控制层次;您可以编写一些代码来控制事件的添加、删除和触发,在其中您可以强制执行规则,并略微调整将发生的情况。例如,您可能希望限制附加到事件的事件处理程序数量。为此,您可以更改上面示例中的 AddHandler 部分:

    AddHandler(ByVal value As EventHandler)
        If _handlers.Count < 8 Then
            _handlers.Add(value)
        End If
    End AddHandler

如果您不需要那种详细的控制,我认为没有必要声明自定义事件。


6

如果您想要与您提及的其他帖子中相同的内容,这是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

但我认为这不是一个好主意,因为事件的sender参数将会是Button,而不是你的UserControl...

相反,你可以订阅Button.Click事件并触发自己的事件(没有显式访问器)。


感谢您的回答...我因为第一篇帖子的全面性而给予了答案标志,但我也点赞了您的回答。我决定在控件内部使用标准委托和事件来包装控件,这样用户控件将会发出事件,而不是子控件...正如您所建议的。谢谢。塞斯 - Seth Spearman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接