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

guilleto 258 Messages postés jeudi 23 octobre 2003Date d'inscription 20 mars 2013 Dernière intervention - 13 juil. 2010 à 10:34 - Dernière réponse : NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 13 juil. 2010 à 13:00
3
Merci
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

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 13 juil. 2010 à 14:46
3
Merci
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

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_casy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 13 juil. 2010 à 11:19
0
Merci
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
Commenter la réponse de cs_casy
guilleto 258 Messages postés jeudi 23 octobre 2003Date d'inscription 20 mars 2013 Dernière intervention - 13 juil. 2010 à 11:44
0
Merci
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
Commenter la réponse de guilleto
guilleto 258 Messages postés jeudi 23 octobre 2003Date d'inscription 20 mars 2013 Dernière intervention - 13 juil. 2010 à 13:51
0
Merci
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
Commenter la réponse de guilleto
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 13 juil. 2010 à 14:05
0
Merci
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
Commenter la réponse de cs_casy
guilleto 258 Messages postés jeudi 23 octobre 2003Date d'inscription 20 mars 2013 Dernière intervention - 13 juil. 2010 à 14:26
0
Merci
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
Commenter la réponse de guilleto
guilleto 258 Messages postés jeudi 23 octobre 2003Date d'inscription 20 mars 2013 Dernière intervention - 13 juil. 2010 à 14:59
0
Merci
Merci Casy pour toute ton aide.

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

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

qui manquait.
maintenant ça marche!!
Commenter la réponse de NSUADI

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.