2009-07-03 97 views
5

請閱讀THIS後。我有這個帖子中描述的相同的問題,但我想在VB.net而不是C#做。如何暴露和提高vb.net winforms用戶控件的自定義事件

我很確定要這樣做,我必須使用自定義事件。 (我用code conversion site去了解自定義事件。)所以在IDE當我鍵入以下內容:

公共定義事件AddRemoveAttendees作爲事件處理

它擴展到下面的代碼片段。

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 

但我找不出如何處理它。直到今天,我從未聽說過定製事件。

我想要的是讓按鈕的點擊事件起泡到用戶控件的容器底線。我知道我可以包裝我自己的事件,但我至少想在我走得更遠的路上之前瞭解自定義事件。

賽斯

回答

7

要使用自定義事件冒泡另一個控件的事件,你可以這樣做:

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 

它提供了一個類似的機制,允許附加和刪除事件處理程序,並提供事件。 Custom事件添加的是額外的控制級別;你可以在添加,刪除和提高事件的過程中編寫一些代碼,在這些代碼中你可以執行規則,並且稍微調整一下會發生什麼。例如,您可能想要限制附加到事件的事件處理程序的數量。爲了實現這一目標,你可以從上面的示例改變AddHandler部分:

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

如果您不需要那種細緻的控制,我認爲沒有必要宣佈自定義事件。

5

如果你想同樣的事情,在你mentionned其他職位,這裏的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事件,並提高你自己的事件(有沒有明確的存取)

+0

謝謝您的回答......我給了回答fi的標誌第一篇文章是因爲它的徹底性,但是提高了你的答案。 我決定換行內控制標準委託和事件的控制,使用戶控件將發出的事件,而不是chilc控制......根據你的建議。謝謝。 Seth – 2009-07-05 04:41:23