Я только начинаю с пользовательских классов, поэтому я написал полоску кнопок. Он наследует панель и заполняет ее кнопками из строк, переданных в мой .Add()
.Получение обработчика событий из экземпляра класса
ButtonStrip1.Add("Button","Texts","Go Here")
Я хотел бы, чтобы он был в состоянии естественным образом захватить обработчик ButtonStrip1.Click
«s и передать его на кнопках детей и удалить его из 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")
Что я в основном хотел бы сделать это (псевдо -код)
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
Я пробовал изменить несколько вещей и многое сделал. Я также пробовал использовать CallByName(Me,"Click",CallType.Method)
и с CallType.Get
, но ошибка, которую я получаю, это Expression 'Click' is not a procedure, but occurs as the target of a procedure call.
Он также возвращает это то же сообщение для необработанных событий, например ButtonStrip1 не имеет MouseDown
Event.
Я также пробовал использовать MyClass
.
Не видел здесь является альтернативой .Add()
, что добавить StoredFN
к B.click
Например, этот щелчок событие работает с моим кодом
Private Sub ButtonStrip1_Click(sender As Object, e As EventArgs) Handles ButtonStrip1.Click
msgbox("You clicked " & sender.text & ".")
End Sub
То, что вы пытаетесь сделать, неверно. Нет никакого способа, чтобы вы получали один из дочерних элементов управления Button как «отправитель» в обработчике событий «Click» кнопки ButtonStrip. Любое событие для объекта должно передавать этот объект «отправителю» обработчиков событий. То, что вы должны делать, - это добавить новое событие ButtonClicked к вашей ButtonStrip и передать кнопку «Button», которая была нажата как свойство параметра 'e'. Если вы хотите пойти так, как вам следует, я дам ответ, который показывает, как это сделать. – jmcilhinney
@jmcilhinney Я обновил свой вопрос, чтобы включить полный код класса. sender.text работает, чтобы дать мне ярлыки кнопок в VS 2015. ... В любом случае, я был бы абсолютно признателен за любые советы. –