dynamicbutton点击事件处理程序

我有100个button在窗体中dynamic创build。 我怎样才能给他们添加事件处理程序?

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

例如,这可能是:

AddHandler theButton.Click, AddressOf Me.theButton_Click 

只是为了得出里德的答案,你可以从Form或其他容器中获取Button对象,并添加处理程序,或者可以通过编程方式创buildButton对象。
如果从Form或其他容器中获得Button对象,则可以遍历Form或其他容器控件(如PanelFowLayoutPanel等)的Controls集合。 然后,您可以添加单击处理程序
AddHandler ctrl.Click, AddressOf Me.Button_Click (variables在下面的代码中),
但我更喜欢检查Control的types,并转换为一个Button ,因为我不添加容器中的任何其他控件(如标签)的点击处理程序。 请记住,您可以使用AddHandler为此时的Button事件添加处理程序。
或者,您可以编程方式创buildButton对象,如下面第二段代码所示。
那么当然你必须编写处理程序方法,就像下面的第三个代码块一样。

这里是一个使用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 

或者以编程方式创buildButton ,这次添加到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 

然后你的处理程序将看起来像这样

 Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Handle your Button clicks here End Sub 

我需要一个通用的事件处理程序,在这个处理程序中,我可以显示哪个button被调用,而不使用开关的情况下,并完成这个…

  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 

@Debasish Sahu,你的回答是对另外一个问题的回答,即:当有一个控制器有一个共同的处理程序时,如何知道哪个button(或任何其他控件)被点击了? 所以我给出了这个问题的答案,我通常如何做,几乎和你的一样,但是请注意,当它处理相同types的控件时,它也可以不经过types转换:

 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 

一些关于这个问题的变体的代码。 使用上面的代码让我的点击事件按需要,但我被困在试图找出哪个button被点击。 我的情况是我有一个dynamic的标签页数量。 在每个标签页上(都是dynamic创build的)2个图表,2个DGV和一对单选button。 每个控件都有一个相对于标签的唯一名称,但如果我有20个标签页,则可能有20个同名的单选button。 单选button可以在两个graphics中的哪一个与DGV之间切换。 下面是当一个单选button被检查时的代码(有一个几乎相同的块交换图表和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检查是在创build表单时停止代码触发。