У меня есть 100 кнопок, созданных динамически в форме. Как я могу добавить к ним обработчик событий?
Динамический обработчик события нажатия кнопки
Ответ 1
Вы можете использовать AddHandler, чтобы добавить обработчик для любого события.
Например, это может быть:
AddHandler theButton.Click, AddressOf Me.theButton_Click
Ответ 2
Чтобы завершить ответ рида, вы можете либо получить объекты Button
из Form
или другого контейнера и добавить обработчик, либо вы можете создать объекты Button
программным способом.
Если вы получаете объекты Button
из Form
или другого контейнера, то вы можете перебирать коллекцию Controls
Form
или другого элемента управления контейнера, такого как Panel
или FowLayoutPanel
и так далее. Затем вы можете просто добавить обработчик кликов с помощью
AddHandler ctrl.Click, AddressOf Me.Button_Click
(переменные как в коде ниже),
но я предпочитаю проверять тип Control
и приводить к Button
, так как я не добавляю обработчики щелчков для каких-либо других элементов управления в контейнере (таких как Метки). Помните, что вы можете добавить обработчики для любого события Button
на данный момент, используя AddHandler
.
В качестве альтернативы вы можете создавать объекты Button
программно, как во втором блоке кода ниже.
Затем, конечно, вам нужно написать метод-обработчик, как в третьем блоке кода ниже.
Вот пример использования Form
в качестве контейнера, но вам, вероятно, лучше использовать Panel
или какой-либо другой элемент управления контейнером.
Dim btn as Button = Nothing
For Each ctrl As Control in myForm.Controls
If TypeOf ctrl Is Button Then
btn = DirectCast(ctrl, Button)
AddHandler btn.Click, AddressOf Me.Button_Click ' From answer by Reed.
End If
Next
В качестве альтернативы создайте Button
программно, на этот раз добавив в контейнер Panel
.
Dim Panel1 As new Panel()
For i As Integer = 1 to 100
btn = New Button()
' Set Button properties or call a method to do so.
Panel1.Controls.Add(btn) ' Add Button to the container.
AddHandler btn.Click, AddressOf Me.Button_Click ' Again from the answer by Reed.
Next
Тогда ваш обработчик будет выглядеть примерно так
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
' Handle your Button clicks here
End Sub
Ответ 3
@Debasish Sahu, ваш ответ - ответ на другой вопрос, а именно: как узнать, какая кнопка (или любой другой элемент управления) была нажата при наличии общего обработчика для пары элементов управления? Поэтому я даю ответ на этот вопрос, как я обычно это делаю, почти так же, как у вас, но учтите, что он работает и без преобразования типов, когда обрабатывает один и тот же тип элементов управления:
Private Sub btn_done_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim selectedBtn As Button = sender
MsgBox("you have clicked button " & selectedBtn.Name)
End Sub
Ответ 4
Мне нужен общий обработчик событий, в котором я могу показать, с какой кнопкой он вызывается без использования case-переключателя... и сделал вот что.
Private Sub btn_done_clicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox.Show("you have clicked button " & CType(CType(sender, _
System.Windows.Forms.Button).Tag, String))
End Sub
Ответ 5
Некоторый код для вариации этой проблемы. Используя приведенный выше код, я получил нужные мне события кликов, но затем я застрял, пытаясь решить, какую кнопку нажать. Мой сценарий: у меня динамическое количество вкладок. На каждой вкладке (все динамически создаются) 2 диаграммы, 2 DGV и пара переключателей. Каждый элемент управления имеет уникальное имя относительно вкладки, но может быть 20 переключателей с тем же именем, если у меня было 20 страниц вкладок. Переключатели переключаются между двумя из двух графиков и DGV, которые вы видите. Вот код для того, когда проверяется один из переключателей (там почти идентичный блок, который меняет местами диаграммы и DGV):
Private Sub radioFit_Components_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
If sender.name = "radioFit_Components" And sender.visible Then
If sender.checked Then
For Each ctrl As Control In TabControl1.SelectedTab.Controls
Select Case ctrl.Name
Case "embChartSSE_Components"
ctrl.BringToFront()
Case "embChartSSE_Fit_Curve"
ctrl.SendToBack()
Case "dgvFit_Components"
ctrl.BringToFront()
End Select
Next
End If
End If
End Sub
Этот код срабатывает для любой из страниц вкладок и заменяет диаграммы и DGV на любой из страниц вкладок. Проверка отправителя. Видимая проверка заключается в том, чтобы остановить запуск кода при создании формы.