2017-02-18 66 views
0

我剛開始使用自定義類,因此我編寫了一個按鈕條。它繼承了一個面板並使用傳遞給我的.Add()的字符串按鈕填充它。從類Instance獲取事件處理程序

ButtonStrip1.Add("Button","Texts","Go Here") 

我想爲它能夠自然地抓住ButtonStrip1.Click的處理程序,並把它傳遞給子按鈕,並從ButtonStrip1刪除。

我一直沒能明白這一點,所以我一直在做

Public Class ButtonStrip 
    Inherits Panel 
    Public Property Innermargin As Integer = 5 
    Dim Offset As Integer = Innermargin 
    Dim Buttons = New List(Of ButtonStrip_Button) 
    Dim StoredFN As EventHandler 

    Public Sub New() 
    End Sub 

    Function Add(fn As EventHandler, ParamArray ByVal Values As String()) 
     StoredFN = fn 
     For Each V In Values 
      Dim B As New ButtonStrip_Button 
      Buttons.Add(B) 
      Me.Controls.Add(B) 
      B.Text = V 
      B.Left = Offset + Innermargin 
      B.Top = Innermargin 

      Offset = B.Left + B.Width 
      AddHandler B.Click, fn 
     Next 
     RemoveHandler Me.Click, fn 
     Me.Width = Offset + Innermargin 
     Me.Height = Buttons(0).height + Innermargin * 2 
    End Function 

    Function Add(ParamArray ByVal Values As String()) 
     If StoredFN Is Nothing Then 
      Throw New Exception("First Add() must supply a function") 
     End If 
     Me.Add(StoredFN, Values) 
    End Function 
End Class 

Public Class ButtonStrip_Button 
    Inherits System.Windows.Forms.Button 
    Public Sub New() 
     AutoSize = True 
     AutoSizeMode = AutoSizeMode.GrowAndShrink 
    End Sub 
End Class 

這是由

ButtonStrip1.Add(AddressOf ButtonStrip1_Click,"Button","Texts","Go Here") 

叫什麼我基本上做的是(僞-code)

Function Add(fn As EventHandler, ParamArray ByVal Values As String()) 
    If StoredFN is Nothing Then StoredFN = Me.Click 
     ... 
     AddHandler B.Click, Me.Click 
    Next 
    RemoveHandler Me.Click, Me.Click 
    ... 
End Function 

我試着改變一些東西,用Google搜索了很多。我也試過使用CallByName(Me,"Click",CallType.Method)CallType.Get,但我得到的錯誤是Expression 'Click' is not a procedure, but occurs as the target of a procedure call.它也返回這個完全相同的消息用於未處理的事件,例如ButtonStrip1沒有MouseDown事件。我也嘗試過使用MyClass

不在這裏看到的是另一種.Add()是添加StoredFNB.click

例如,這個click事件與我的代碼

Private Sub ButtonStrip1_Click(sender As Object, e As EventArgs) Handles ButtonStrip1.Click 
    msgbox("You clicked " & sender.text & ".") 
End Sub 
+0

你想要做的是錯誤的。沒有辦法讓你在ButtonStrip的'Click'事件處理器中獲得'''Button'控件的一個''sender'。對象的任何事件都應該傳遞給它的事件處理程序的'sender'。你應該做的是在你的'ButtonStrip'中添加一個新的'ButtonClicked'事件並傳遞被點擊的'Button'作爲'e'參數的屬性。如果你想這樣做,你應該怎麼做,然後我會提供一個答案來說明如何。 – jmcilhinney

+0

@jmcilhinney我更新了我的問題以包含課程的完整代碼。 sender.text正在努力給我在VS 2015中的按鈕標籤。無論如何,我會非常感謝任何建議。 –

回答

2

什麼我建議是這樣的工作:

Public Class ButtonStrip 
    Inherits Panel 

    Public Event ButtonClick As EventHandler(Of ButtonClickEventArgs) 

    Protected Overridable Sub OnButtonClick(e As ButtonClickEventArgs) 
     RaiseEvent ButtonClick(Me, e) 
    End Sub 

    Private Sub Buttons_Click(sender As Object, e As EventArgs) 
     OnButtonClick(New ButtonClickEventArgs(DirectCast(sender, Button))) 
    End Sub 

    Public Sub Add(ParamArray values As String()) 
     Dim btn As New Button 

     AddHandler btn.Click, AddressOf Buttons_Click 

     '... 
    End Sub 

End Class 


Public Class ButtonClickEventArgs 
    Inherits EventArgs 

    Public ReadOnly Property Button As Button 

    Public Sub New(button As Button) 
     Me.Button = button 
    End Sub 

End Class 

現在不需要傳遞事件處理程序了。當單擊Button時,ButtonStrip將處理該事件,然後引發自己的ButtonClick事件。 ButtonStripButtons都不必關心處理該事件的任何方法,因爲它將以與其他任何事件相同的方式進行處理。在表格中,您將處理ButtonStripButtonClick事件並獲取從e.Button單擊的Button。如果您想知道Button的位置,您也可以添加Index屬性,而不是Button本身。