Asp.net控件与自定义事件

时间:2013-07-25 13:26:09

标签: asp.net vb.net events user-controls

我有一个有自定义事件的控件。

目前我将其定义为任何其他事件

Public Event ContentChanged As EventHandler

但今天我发现一篇文章他们有一种完全不同的处理方式

Shared ReadOnly contentChangedKey As New Object()

Public Custom Event ContentChanged As EventHandler
    AddHandler(value As EventHandler)
        Me.Events.AddHandler(contentChangedKey, value)
    End AddHandler
    RemoveHandler(value As EventHandler)
        Me.Events.RemoveHandler(contentChangedKey, Value)
    End RemoveHandler
    RaiseEvent(sender As Object, e As EventArgs)
        Dim contentChangedDelegate As EventHandler = _
            Me.Events(contentChangedKey)
        contentChangedDelegate(sender, e)
    End RaiseEvent 
End Event

第二种方式似乎过于复杂,它的第一个例子不是什么?

1 个答案:

答案 0 :(得分:1)

它有过度复制:)

换句话说,你可以添加任何其他类型的处理,当envent发生或绑定时需要这样做。由于您正在控制添加,删除或引发事件处理程序时所采取的操作,因此您可以执行自定义操作。

例如,假设你有一个有5个按钮的控件。然而,除非正在处理事件X,否则其中一个按钮将无法使用。

使用自定义事件处理程序,您可以执行此操作:

Public Custom Event ContentChanged As EventHandler
    AddHandler(value As EventHandler)
        Me.Events.AddHandler(contentChangedKey, value)
        Me.SpecialButton.visible = true
    End AddHandler
    RemoveHandler(value As EventHandler)
        Me.Events.RemoveHandler(contentChangedKey, Value)
        Me.SpecialButton.visible = false 
    End RemoveHandler
    RaiseEvent(sender As Object, e As EventArgs)
        Dim contentChangedDelegate As EventHandler = _
            Me.Events(contentChangedKey)
        contentChangedDelegate(sender, e)
    End RaiseEvent 
End Event

如果您没有自定义事件处理程序,那么执行此类逻辑将非常困难。这一切都归结为粒度;你需要多少控制力?

当然,您需要确保在AddHandlerRemoveHandler被触发时,您希望在那里使用的任何内容都是真实的。 这是一个过于简化的示例