Comment utiliser un évènement d'une liste d'objets? [Résolu]

Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
- - Dernière réponse : cs_JGD
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
3
Merci
Bonjour,

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

Bonne prog.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
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 ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
0
Merci
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
Commenter la réponse de cs_JGD
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
0
Merci
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
Commenter la réponse de cs_JGD
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
0
Merci
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
Commenter la réponse de cs_JGD
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
0
Merci
Impeccable.

Merci beaucoup. Tout fonctionne exactement comme je le souhaitais.

GIGADEP
Commenter la réponse de cs_JGD
Messages postés
48
Date d'inscription
vendredi 17 janvier 2003
Dernière intervention
6 décembre 2012
0
Merci
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
Commenter la réponse de cs_JGD

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.