Использование AddressOf динамически

Я добавляю кнопки для формы во время выполнения, используя следующий код:

Private Sub AddNewButton(ByVal btnName As String, ByVal btnText As String)
    Dim myButtons As New VIBlend.WinForms.Controls.vButton

    With myButtons
        .Size = New Size(200, 60)
        .Visible = True
        .Location = New Point(55, 33)
        .Text = btnText
        .Name = btnName
        .Font = New Font("Times New Roman", 12, FontStyle.Bold, GraphicsUnit.Point)
    End With

    AddHandler myButtons.Click, AddressOf btnName & "_Click"

    btnsPanel.Controls.Add(myButtons)

End Sub

Код работает нормально, но Vb.net не позволяет мне назначать AddressOf подпроцедуры с использованием переменной AddressOf btnName & "_Click" говорит AddressOf operand must be the name of methodпроблема в том, что я не знаю, какая кнопка будет создана и какую процедуру она будет вызывать, я хочу назначить процедуру AddressOf с помощью переменной Возможно ли это или у меня есть какой-либо другой выбор?

3 ответа

Решение

Вы можете (и должны) использовать один и тот же обработчик событий для всех кнопок.

AddHandler myButtons.Click, AddressOf btn_Click

Вы можете получить имя в обработчике следующим образом:

Private Sub btn_Click(sender As Object, e As EventArgs)
    Dim button = DirectCast(sender, Button)
    Dim name As String = button.Name ' you can also use the Tag property
End Sub

Вы также можете использовать закрытие, которое я всегда нахожу очень гибким и читаемым.

Imports VIBlend.WinForms.Controls

Private Sub AddNewButton(ByVal btnName As String, ByVal btnText As String)
    Dim myButton = New vButton() With
                    {
                        .Size = New Size(200, 60),
                        .Visible = True,
                        .Location = New Point(55, 33),
                        .Text = btnText,
                        .Name = btnName,
                        .Font = New Font("Times New Roman", 
                                 12, FontStyle.Bold, GraphicsUnit.Point)
                    }

    AddHandler myButton.Click, Sub(s, e)
                                   'Do something with Name
                                   MessageBox.Show(myButton.Name)
                                   'Or do something in a instance method
                                   Me.HandleButtonClick(myButton)
                               End Sub

    btnsPanel.Controls.Add(myButton)
End Sub

Private Sub HandleButtonClick(myButton As vButton)
    ' DO something her with myButton
End Sub

Вопрос, хотя и старый, не имеет прямого и полного ответа. Вот он, полностью динамический обработчик (динамической) кнопки:

    Dim SubName As String = dr("SubToRun").ToString
    Dim Pareameter1 As String = dr("Pareameter1").ToString
    Dim Pareameter2 As String = dr("Pareameter2").ToString
    Dim Pareameter3 As Int32 = ValPareameter3
    AddHandler btn.Click, Sub(s, e)
                              CallByName(Me, SubName, CallType.Method, Pareameter1, Pareameter2, Pareameter1)
                          End Sub
Другие вопросы по тегам