Affecter du code à un controle cré dynamiquement.

Résolu
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 13 juil. 2010 à 10:34
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 - 15 juil. 2010 à 21:41
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juil. 2010 à 13:00
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
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juil. 2010 à 14:46
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
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juil. 2010 à 11:19
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
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
13 juil. 2010 à 11:44
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
0

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

Posez votre question
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
13 juil. 2010 à 13:51
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 juil. 2010 à 14:05
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
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
13 juil. 2010 à 14:26
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
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
13 juil. 2010 à 14:59
Merci Casy pour toute ton aide.

Olivier
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
14 juil. 2010 à 22:01
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!!
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
15 juil. 2010 à 09:26
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
15 juil. 2010 à 09:41
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
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
15 juil. 2010 à 21:41
ICONIC FIGURE

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

qui manquait.
maintenant ça marche!!
0
Rejoignez-nous