Affecter du code à un controle cré dynamiquement. [Résolu]

Signaler
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
-
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
-
Bonjour à toutes et tous.

J'ai longtemps programmé en VB6 et le système de contrôle indexé était assez pratique.

Actuellement passé sous Visual Basic 2008 Express et n'ayant pas d'index (ou alors je ne l'ai pas trouvé) sur un controle, j'ai écrit ces quelques lignes afin de créer dynamiquement des Boutons Radio :

 
    Dim RB_Soft(0 To 20) As RadioButton

    For Cpt = 0 to 10
        RB_Soft(Cpt).Parent = MaGroupBox
        RB_Soft(Cpt).Text = "Contrôle n°" & Cpt
        RB_Soft(Cpt).Top = Haut + RB_Soft(0).Height * Cpt
        RB_Soft(Cpt).Left = Gauche
        RB_Soft(Cpt).Visible = True
        Cpt += 1
      End If
    Exit For


Cela fonctionne !

Le souci c'est que je n'arrive pas à affecter du code à ces boutons radio.

Comment puis-je faire cela ?

Par avance merci

Olivier

12 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Il te faut dans le code une méthode capable de répondre à l'évènement que tu souhaite sur tes controles, ici, on va dire que c'est l'évènement checkedchanged de tes radiobuttons.

Par exemple :
	Private Sub RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim rb As RadioButton = DirectCast(sender, RadioButton)

If rb.Checked Then MessageBox.Show(String.Format("{0} est sélectionné",rb.Name))
End Sub


Ensuite il faut donc que tu abonne l'évènement checkedchanged de chaque radiobutton à ta méthode. Pour simplifier ici on va tous les abonner à la même méthode, ce qui est l'équivalent des groupes de contrôles de VB6 :

    Dim RB_Soft(0 To 20) As RadioButton

    For Cpt = 0 to 10
        RB_Soft(Cpt).Parent = MaGroupBox
        RB_Soft(Cpt).Text = "Contrôle n°" & Cpt
        RB_Soft(Cpt).Top = Haut + RB_Soft(0).Height * Cpt
        RB_Soft(Cpt).Left = Gauche
        RB_Soft(Cpt).Visible = True

        AddHandler RB_Soft(Cpt).CheckedChanged, AddressOf RadioButton_CheckedChanged

      End If
    Exit For


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Si ton tableau RB_Soft est une variable globale, il te suffit de reparcourir ce tableau, sinon il faudra parcourir la liste collection Controls de ton controle MaGroupBox

En supposant que ton tableau est global :

    For Cpt = 0 to 10
        
        RemoveHandler RB_Soft(Cpt).CheckedChanged, AddressOf RadioButton_CheckedChanged

        RB_Soft(Cpt).Dispose
    Next


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Utilise la fonction AddHandler pour abonner les évènements de tes contrôles aux méthodes correspondantes.

Et si tu détruit ensuite tes contrôles aussi par le code, pense avant à désabonner les évènements avec RemoveHandler


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Bonjour Casy,

Merci pour ta réponse mais j'avoue que je ne comprends pas trop.
Je viens de regarder pour AddHandler sur l'aide n ligne de MSDN mais j'avoue ne pas être avancé pour autant.

Je souhaiterais lorsque je sélectionne un contrôle affecter à une variable globale une valeur.

Comment puis-je faire cela avec le AddHandler ?

Par avance merci

Olivier
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Merci Casy,

Cela fonctionne bien !

Si j'ai bien compris ce que tu as écris :
1°) On créé des objets (dans le cas présent des Boutons Radio).
2°) On détermine un code générique qui s'applique au type de contrôle avec l'événement 'CheckedChanged'.
3°) On lie les objets créés à ce code générique via le AddHandler.

C'est bien cela ?

En tout cas merci de ton aide.

Olivier
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
C'est tout à fait ça.

Par contre, il faut que la signature de la méthode qui va répondre à ton contrôle corresponde bien à celle attendue par le gestionnaire d'évènement.

En cas de doute, tu pose un contrôle correspondant sur ta page, tu vas chercher l'évènement correspondant de ce contrôle afin que la signature de la méthode soit crée, il ne te reste plus ensuite à supprimer le contrôle et garder la méthode.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Merci Casy,

Je crois avoir compris pour ce qui est de la signature de la méthode.

Juste une dernière question : Lorsque je clique sur un bouton je créé mes contrôles, et si je clique à nouveau dessus cela me créé d'autres instances de ces boutons : comment dois-je faire pour supprimer les anciens contrôles avant de les recréer ?

Par avance merci

Olivier
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Merci Casy pour toute ton aide.

Olivier
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
1
ICONIC FIGURE
bonsoir!!
je suivais votre discussion car elle me semble très intéressante mais lorsque j'applique le code que Guilleto a donné:
 Dim RB_Soft(0 To 20) As RadioButton
             ' Try
        For Cpt = 0 To 10
            RB_Soft(Cpt).Parent = GroupBox1 'l'exécution bug sur cette ligne
            RB_Soft(Cpt).Text = "Contrôle n°" & Cpt
            RB_Soft(Cpt).Top = 100 + RB_Soft(0).Height * Cpt
            RB_Soft(Cpt).Left = 50
            RB_Soft(Cpt).Visible = True
            'AddHandler RB_Soft(Cpt).CheckedChanged, AddressOf RadioButton1_CheckedChanged

            Cpt += 1

        Next

j'ai une exception de type System.NullReferenceException(avec le message:La référence d'objet n'est pas définie à une instance d'un objet)
que pourrait être à la base de cette exception?
Merci d'avance!!
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Bonjour NSUADI,

Essaye de mettre ce code :

Dim RB_Soft(0 To 20) As RadioButton
             ' Try
        For Cpt = 0 To 10
            RB_Soft(Cpt) = New RadioButton ' <= Ligne a ajouter !
            RB_Soft(Cpt).Parent = GroupBox1 'l'exécution bug sur cette ligne
            RB_Soft(Cpt).Text = "Contrôle n°" & Cpt
            RB_Soft(Cpt).Top = 100 + RB_Soft(0).Height * Cpt
            RB_Soft(Cpt).Left = 50
            RB_Soft(Cpt).Visible = True
            'AddHandler RB_Soft(Cpt).CheckedChanged, AddressOf RadioButton1_CheckedChanged

            Cpt += 1

        Next


Cela devrait fonctionner.

Olivier
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
A noter que GroupBox1 est un controle de type GroupBox nommé GroupBox1 (nom donné par défaut) qui doit être posé sur ton écran et dans lequel les radiobuttons vont se créer.

Si tu souhaite créer les radiobuttons directement sur l'écran (ou dans un autre controle container) remplace GroupBox1 par Me (ou par le nom du controle recevant les radiobuttons)


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
1
ICONIC FIGURE

Merci!!
c'est l'instruction justement
 RB_Soft(Cpt) = New RadioButton ' <= Ligne a ajouter !

qui manquait.
maintenant ça marche!!