2017-02-18 7 views
0

Я только начинаю с пользовательских классов, поэтому я написал полоску кнопок. Он наследует панель и заполняет ее кнопками из строк, переданных в мой .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 
+0

То, что вы пытаетесь сделать, неверно. Нет никакого способа, чтобы вы получали один из дочерних элементов управления Button как «отправитель» в обработчике событий «Click» кнопки ButtonStrip. Любое событие для объекта должно передавать этот объект «отправителю» обработчиков событий. То, что вы должны делать, - это добавить новое событие ButtonClicked к вашей ButtonStrip и передать кнопку «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 

Теперь нет необходимости передавать обработчики событий. При нажатии на ButtonButtonStrip обрабатывает это событие, а затем вызывает свое собственное событие ButtonClick. Ни ButtonStrip, ни Buttons не должны заботиться о любых методах, которые обрабатывают это событие, поскольку они будут обрабатываться так же, как и любое другое событие. В форме вы затем обрабатываете событие ButtonClickButtonStrip и получаете Button, который был нажат с e.Button. Вы также можете добавить свойство Index, если хотите знать позицию Button, а не Button.

Смежные вопросы