2013-07-25 46 views
0

我有一个具有自定义事件的控件。带自定义事件的Asp.net控件

目前我定义它像任何其他事件

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

它overcomplication :)

你可以在没有任何其他类型的处理,需要时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被触发时,您期望在其中使用的任何内容都是真实的。 这是一个过于简单的例子

+0

好,但me.Events做任何事情特别的吗?如果我正确,我可以使用[委托] .Combine和[委托]。删除并有一个私人的EventHandler? – Peter

+0

我还没有工作太多与代表作为事件处理程序,但我确实发现[本条](http://blog.monstuff.com/archives/000040.html),这是非常丰富的。基本上,一个事件是一个特殊的代表,它比常规代表有一些优点。那篇文章是C#但是因为它全是.NET,所以概念是一样的。 –