Comment utiliser un évènement d'une liste d'objets?

Résolu
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012 - 30 nov. 2011 à 10:53
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012 - 30 nov. 2011 à 17:39
Bonjour à tous,

J'ai beau fouiller dans le forum, je ne trouve pas la réponse à mon problème.
Lorsque je crée une liste d'objets
exemple:
Dim GroupeBoite As New List(Of GroupBox)

j'arrive à déposer des objets dans ma liste
GroupeBoite.Add(GroupBox1)
GroupeBoite.Add(GroupBox2)
...

Par contre, j'aurais voulu que lorsque je clique sur une des GroupBox de ma liste, je puisse déclancher une action sans devoir écrire cette action dans chaque GroupBox.

Pour l'instant je dois écrire quelquechose du genre:

Private Sub GroupBox1_Click(sender As Object, e As System.EventArgs) Handles GroupBox1.Click
Label1.Text = GroupBox1.Text
End Sub
Private Sub GroupBox2_Click(sender As Object, e As System.EventArgs) Handles GroupBox2.Click
Label1.Text = GroupBox2.Text
End Sub
...
Private Sub GroupBox30_Click(sender As Object, e As System.EventArgs) Handles GroupBox30.Click
Label1.Text = GroupBox30.Text
End Sub

Mais ayant une trentaine de GroupBox, j'aimerais arriver à quelquechose qui ressemblerait à:

Private Sub GroupeBoite_Click(sender As Object, e As System.EventArgs) Handles GroupBox1.Click
Label1.Text = GroupeBoite(i).Text '>> avec i qui serait récupéré lors du click
End Sub
ou bien une solution équivalente.

GroupeBoite n'apparaissant pas dans la liste des objets, je ne sais pas comment procéder.

La solution est sûrement très simple, mais je débute dans les listes. Merci de m'expliquer avec beaucoup de détails car je ne suis pas un pro de la programmation.

Cordialement.

GIGADEP

10 réponses

Utilisateur anonyme
30 nov. 2011 à 11:25
Bonjour,

Tu dois abonner le contrôle à un événement.
Utilise AddHandler.

Bonne prog.
3
Utilisateur anonyme
30 nov. 2011 à 12:10
Si tu veux un petit exemple :
Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'on veut intégrer 11 groupbox au formulaire
        For x = 10 To 0 Step -1
            'nouveau groupbox
            Dim box As New GroupBox
            'nom position
            box.Name = "box" & x.ToString
            box.Left = x * 15
            'abonnement à l'événement click
            AddHandler box.Click, AddressOf box_click
            'ajout au formulaire
            Me.Controls.Add(box)
        Next
        MessageBox.Show("cliquer sur un groupbox")
    End Sub
    Private Sub box_click(ByVal sender As Object, ByVal e As EventArgs)
        'il faut ici caster l'objet sender dans le bon type (qu'on connait) pour accéder
        'à ses propriétés, méthodes etc...
        MessageBox.Show(DirectCast(sender, GroupBox).Name & " vient d'etre cliqué")
    End Sub
End Class
3
Utilisateur anonyme
30 nov. 2011 à 15:03
Par contre, j'aurais voulu que lorsque je clique sur une des GroupBox de ma liste, je puisse déclancher une action sans devoir écrire cette action dans chaque GroupBox.

C'est exactement ce que je t'ai proposé dans l'exemple de code.
L'as-tu testé en cliquant sur les groupbox ?
3
Utilisateur anonyme
30 nov. 2011 à 16:02
Si tu cherches à récupérer un index dans une List(Of ... , tu peux faire comme ceci :
Option Strict On
Public Class Form1
    Dim Liste As New List(Of GroupBox)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For x = 10 To 0 Step -1
            Dim box As New GroupBox
            box.Name = "box" & x.ToString
            box.Left = x * 15
            AddHandler box.Click, AddressOf box_click
            Liste.Add(box)
            Me.Controls.Add(box)
        Next
        MessageBox.Show("cliquer sur un groupbox")
    End Sub
    Private Sub box_click(ByVal sender As Object, ByVal e As EventArgs)
        Dim box As GroupBox = DirectCast(sender, GroupBox)
        Dim index As Integer = Liste.IndexOf(box)
        MessageBox.Show(index.ToString)
    End Sub
End Class
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
30 nov. 2011 à 17:00
De rien
Jette quand même un coup d'oeil aux composants TableLayoutPanel et FlowLayoutPanel qui te permettent facilement de placer des contrôles (dynamiquement ou à la création) sur un formulaire ou d'y accéder sans se soucier des index.
3
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012
30 nov. 2011 à 11:31
Merci pour la réponse rapide.
Je vais me plonger dans la syntaxe de AddHandler. Si j'ai un problème, je vous solliciterai à nouveau.

GIGADEP
0
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012
30 nov. 2011 à 14:41
Avec l'exemple c'est un peu plus clair. Mais je ne vois pas comment intégrer l'ensemble de mes éléments GroupeBoite dans le AddHandler.
Rappels du contenu de mon programme:

Dim GroupeBoite As New List(Of GroupBox)
GroupeBoite.Add(GroupBox1)
GroupeBoite.Add(GroupBox2)
...

Est-ce que je peux écrire:
for i=0 to 29
AddHandler GroupeBoite(i).Click, AddressOf ActionSiClick
Next i

Sub ActionSiClick()
...

Merci d'avance.
GIGADEP
0
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012
30 nov. 2011 à 15:28
On approche, mais avec DirectCast, j'arrive à récupérer le nom de l'objet sur lequel j'ai cliqué. Je cherche à obtenir le numéro de cet objet dans ma liste GroupeBoite. C'est sûrement tout bête, mais je ne trouve pas.


GIGADEP
0
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012
30 nov. 2011 à 16:33
Impeccable.

Merci beaucoup. Tout fonctionne exactement comme je le souhaitais.

GIGADEP
0
cs_JGD Messages postés 48 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 6 décembre 2012
30 nov. 2011 à 17:39
Merci. J'en prends note. J'ai commencé à regarder les composants TableLayoutPanel et FlowLayoutPanel.
Au premier abord, ça m'a l'air un peu compliqué et je ne sais pas encore ce que je pourrais en tirer. Mais je suppose qu'après avoir regardé d'un peu plus près, ça me paraîtra plus facile et très intéressant.


GIGADEP
0
Rejoignez-nous