Использование 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