Clic sur le bouton Dynamic event handler

j'ai 100 boutons créés dynamiquement sous une forme. Comment puis-je leur ajouter un gestionnaire d'événements?

26
demandé sur Crono 2011-09-11 02:19:44

5 réponses

Vous pouvez utiliser AddHandler pour ajouter un gestionnaire pour tout événement.

Par exemple, ce pourrait être:

AddHandler theButton.Click, AddressOf Me.theButton_Click
46
répondu Reed Copsey 2013-01-02 19:58:49

juste pour compléter la réponse de Reed, vous pouvez obtenir le Button objets de l' Form ou autre conteneur et ajouter le handler, ou vous pouvez créer le Button objets par programmation.

Si vous obtenez l' Button objets de l' Form ou autre conteneur, alors vous pouvez itérer sur le Controls collection Form ou autre contrôle du conteneur, tel que Panel ou FowLayoutPanel et ainsi de suite. Vous pouvez alors juste ajouter le gestionnaire de clic avec

AddHandler ctrl.Click, AddressOf Me.Button_Click (variables comme dans le code ci-dessous),

mais je préfère vérifier le type de l' Control et en fonte pour un Button donc je n'ajoute pas de gestionnaires de clics pour d'autres contrôles dans le conteneur (tels que les étiquettes). Rappelez-vous que vous pouvez ajouter des handlers pour tout événement de la Button à ce point en utilisant AddHandler.

Vous pouvez aussi créer le Button objets par programme, comme dans le deuxième bloc de code ci-dessous.

Alors bien sûr, vous devez écrire le méthode handler, comme dans le troisième bloc de code ci-dessous.

Voici un exemple d'utilisation Form le conteneur, mais vous êtes probablement mieux d'utiliser un Panel ou un autre contrôle de conteneur.

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

alternativement créer le Buttons par programme, en ajoutant cette fois un Panel conteneur.

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

alors votre gestionnaire ressemblera à quelque chose comme ceci

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    ' Handle your Button clicks here
End Sub
10
répondu Jason S 2012-06-04 02:05:56

@Debasish Sahu, votre réponse est une réponse à une autre question, à savoir: comment savoir quel bouton (ou tout autre contrôle) a été cliqué quand il ya un gestionnaire commun pour un couple de contrôles? Donc je donne une réponse à cette question comment je le fais habituellement, presque comme le vôtre, mais notez que cela fonctionne aussi sans conversion de type quand il gère le même type de contrôles:

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
répondu monami 2016-11-19 17:54:18

j'avais besoin d'un handler d'événement commun dans lequel je peux montrer à partir de quel bouton il est appelé sans utiliser le boîtier de switch... et fait de cette manière..

  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
1
répondu Debasish Sahu 2011-09-17 06:10:24

un peu de code pour une variation sur ce problème. En utilisant le code ci-dessus m'a obtenu mes événements de clic comme nécessaire, mais j'étais alors coincé en essayant de travailler sur quel bouton avait été cliqué. Mon scénario est que j'ai une quantité dynamique de pages d'onglet. Sur chaque page d'onglet sont (tous dynamiquement créés) 2 Graphiques, 2 DGVs et une paire de boutons radio. Chaque contrôle a un nom unique par rapport à l'onglet, mais il pourrait y avoir 20 boutons radio avec le même nom si j'avais 20 pages d'onglet. Les boutons radio commutent entre lequel des les 2 graphiques et les DGV que vous pouvez voir. Voici le code pour quand un des boutons radio est coché (il y a un bloc presque identique qui change les charts et DGVs en arrière):

   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

ce code va s'allumer pour n'importe laquelle des pages d'onglets et échanger les graphiques et DGVs sur n'importe laquelle des pages d'onglets. Expéditeur.le contrôle visible est d'arrêter la mise à feu du code lorsque le formulaire est créé.

0
répondu Kristian 2014-02-20 16:44:03