动态按钮单击事件处理程序

时间:2011-09-10 22:19:44

标签: vb.net

我在表单中动态创建了100个按钮。我怎样才能为它们添加事件处理程序?

5 个答案:

答案 0 :(得分:48)

您可以使用AddHandler为任何事件添加处理程序。

例如,这可能是:

AddHandler theButton.Click, AddressOf Me.theButton_Click

答案 1 :(得分:11)

为了完善Reed的答案,您可以从Button或其他容器中获取Form个对象并添加处理程序,也可以通过编程方式创建Button个对象。登记/> 如果从Button或其他容器中获取Form个对象,则可以迭代Controls或其他容器控件的Form集合,例如{{1 }或Panel等等。然后,您可以添加点击处理程序 FowLayoutPanel(变量如下面的代码所示),
但我更喜欢检查AddHandler ctrl.Click, AddressOf Me.Button_Click的类型并转换为Control,因为我没有为容器中的任何其他控件添加点击处理程序(例如标签)。请记住,此时您可以使用ButtonButton的任何事件添加处理程序 或者,您可以以编程方式创建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 answer by Reed.
Next

答案 2 :(得分: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

答案 3 :(得分:1)

我需要一个公共事件处理程序,我可以在其中显示调用哪个按钮而不使用switch 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

答案 4 :(得分:0)

有关此问题的变体的一些代码。使用上面的代码可以根据需要获取我的点击事件,但后来我试图弄清楚哪个按钮被点击了。 我的方案是我有一个动态数量的标签页。在每个标签页上都是(所有动态创建的)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。 sender.visible检查是在创建表单时停止代码触发。