我剛開始使用自定義類,因此我編寫了一個按鈕條。它繼承了一個面板並使用傳遞給我的.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()
是添加StoredFN
到B.click
例如,這個click事件與我的代碼
Private Sub ButtonStrip1_Click(sender As Object, e As EventArgs) Handles ButtonStrip1.Click
msgbox("You clicked " & sender.text & ".")
End Sub
你想要做的是錯誤的。沒有辦法讓你在ButtonStrip的'Click'事件處理器中獲得'''Button'控件的一個''sender'。對象的任何事件都應該傳遞給它的事件處理程序的'sender'。你應該做的是在你的'ButtonStrip'中添加一個新的'ButtonClicked'事件並傳遞被點擊的'Button'作爲'e'參數的屬性。如果你想這樣做,你應該怎麼做,然後我會提供一個答案來說明如何。 – jmcilhinney
@jmcilhinney我更新了我的問題以包含課程的完整代碼。 sender.text正在努力給我在VS 2015中的按鈕標籤。無論如何,我會非常感謝任何建議。 –