Подтвердить что ты не робот

Динамический обработчик события нажатия кнопки

У меня есть 100 кнопок, созданных динамически в форме. Как я могу добавить к ним обработчик событий?

4b9b3361

Ответ 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 на любой из страниц вкладок. Проверка отправителя. Видимая проверка заключается в том, чтобы остановить запуск кода при создании формы.