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?
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
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 avecAddHandler 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 Button
s 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
@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
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
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éé.