我在表单中动态创建了100个按钮。我怎样才能为它们添加事件处理程序?
答案 0 :(得分:48)
答案 1 :(得分:11)
为了完善Reed的答案,您可以从Button
或其他容器中获取Form
个对象并添加处理程序,也可以通过编程方式创建Button
个对象。登记/>
如果从Button
或其他容器中获取Form
个对象,则可以迭代Controls
或其他容器控件的Form
集合,例如{{1 }或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 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检查是在创建表单时停止代码触发。