2013-07-25 191 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,所以概念是一樣的。 –