IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Utiliser "Radiobutton.Checked" avec nom de variable


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut Utiliser "Radiobutton.Checked" avec nom de variable
    Bonjour à tous!

    J'ai une looongue liste de radiobutton dans un questionnaire et je voudrais savoir lequel est sélectionné par l'utilisateur pour chaque question.

    Pour cela j'ai crée une variable qui me donne le nom du radiobutton en fonction de sa ligne (Question) et de sa colonne(Réponse).
    Par exemple le rdn1_3.text est sur la ligne 1 et colonne 3.
    Ma variable( as string) est NomRdn = "rdn" & NumLineRdn & "_" & NumColRdn & ".text"

    Pour savoir lesquels sont choisis j'ai fait des boucles for pour passer tous les radiobutton en revu et je teste à chaque fois : NomRdn .Checked=true

    Mais ca ne marche pas, mon message d'erreur est
    'Checked' is not a member of 'String'. (BC30456)

    Question annexe : comment ne pas avoir de radiobutton choisi par défaut à l'affichage?

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Pour ta question annexe : si tu fais une boucle dans ton FormLoad avec
    RadioButton.Checked = False
    ça ne marche pas ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Pour votre question annexe : dans votre formulaire, si vous choisissiez Checked = False pour chaque RadioButton alors aucun d'eux sera coché au démarrage de l'appli.

    Pour l'erreur, vous cherchez à trouver le membre "Checked" de la variable NomRdn hors cette variable n'est pas un RadioButton mais un String !

    N'est il pas possible de créer un tableau de RadioButton (d'autant de colonnes et de lignes que votre questionnaire), de le charger lors du Load ou du premier Activated puis de travailler sur ce tableau en indexant chaque cellule (donc chaque RadioButton) ?

    Cordialement.

  4. #4
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Points : 119
    Points
    119
    Par défaut
    Je ne comprends pas pourquoi tu dis qu'aucun d'eux sera décoché au lancement de l'appli... j'ai essayé chez moi (bon, il n'y en a que 3) et ça me déselectionne tous les RadioButton au démarrage.
    Est-ce qu'il fait quelque chose à mon insu ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai édité mon message pour modifier mon erreur ... autant pour moi !

    Normalement quand vous choisissez l'état de démarrage d'un RadioButton (dans Checked de ses propriétés), alors c'est cet état qui sera utilisé au chargement de la fenêtre.

    Cordialement.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Points : 119
    Points
    119
    Par défaut
    Donc, si Lea fait une boucle avec RadioButton.Checked = False
    ça devrait fonctionner. Non ?
    (Enfin, si j'ai bien compris ce que tu dis)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Absolument !

    D'où l'intérêt de placer tous les RadioButon dans un tableau du même type, ça permet de faire des boucles et des indexations plus simplement.

    Si le tableau est créé avec plusieurs colonnes et une multitude de lignes, que chaque cellule correspond à un RadioButon alors l'index de la colonne du tableau sera le même que celui du questionnaire (pareil pour la ligne...).

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Je les ai déjà placés dans un tableau (à la base pour créer mon design), je les ai mis dans un TablelLayoutPanel.
    Avec ça je peux faire une indexation en lignes et colonnes? Si oui, comment?
    Parce que c'est vrai que ce serait bien pratique qu'en même!

    Sinon pour la boucle, avec checked=False mon problème est le même, je n'arriverai pas à tous les passer en revu. Je crois que je vais être obliger de le faire un par un dans le Formdesigner...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Mon idée était de faire ça dans un tableau du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim TableauRdn(100, 2) As RadioButton
     
    TableauRdn(0, 0) = rdn0_0
    TableauRdn(0, 1) = rdn0_1
    TableauRdn(0, 2) = rdn0_2
    TableauRdn(1, 0) = rdn1_0
    TableauRdn(1, 1) = rdn1_1
    TableauRdn(1, 2) = rdn1_2
    TableauRdn(2, 0) = rdn2_0
    Ensuite il suffit de gérer les index comme il faut selon votre code.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    C'est vrai que l'idée est bonne. Seulement j'ai plus de 350 radio buttons...

  11. #11
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Points : 119
    Points
    119
    Par défaut
    Peut-être pourrais-tu faire une boucle (je sais, j'aime bien les boucles) dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For ligne = 0 to max ligne
       For colonne = 0 to max colonne
           TableauRdn(ligne, colonne) = rdnligne_colonne
       Next colonne
    Next ligne
    (Enfin, moi j'dis ça... je ne sais pas si ça pourrais marcher...)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Comment sont placés vos RadioButton ?
    Sont-ils tous dans le même TableLayoutPanel ?

    Si c'est le cas alors il suffit d'utiliser la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Dim TableauRdn(100, 2) As RadioButton
            Dim LigneColonne() As String
            Dim Chaine As String
            For Each rdb As RadioButton In TableLayoutPanel1.Controls
                ' attributation de chaque RadioButton dans le tableau
                Chaine = rdb.Name.Substring(3)
                LigneColonne = Chaine.Split("_")
                TableauRdn(LigneColonne(0), LigneColonne(1)) = rdb
            Next
    Quelque soit leur place, leur position, il suffit que leur nom soit toujours construit de la même manière : commencer par "rdn" (ou trois lettres) puis par le numéro de la ligne puis "_" et finir par le numéro de la colonne.

    TableauRdn devra avoir les dimensions adéquates pour recevoir les 350 RadioButton.

    Ne pas oublier que le tableau commence par l'index 0 donc si vos RadioButton commencent par 1, ça donnera une dimension vide...

    Cordialement.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Wapi_gi, c'est déjà ce que j'ai fait et c'est de là que vient mon problème de départ^^

    Mes radiobuton sont en effet tous dans le même TableLayoutPanel que j'ai en fait utiliser comme un tableau classique, j'ai mis un radiobutton par case.
    Je crois que je peux donc essayer votre solution. Mais je ne suis pas sûre d'avoir bien tout compris...

    Je vous retiens au courant ;-)
    Merci beaucoup pour votre aide

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Ma solution est de balayer tous les RadioButton se trouvant dans le TabeLayoutPanel et selon leur nom (qui, normalement, est toujours écrit selon leur ligne et leur colonne), les écrire dans le tableau.

    Une fois fait, il suffit de balayer votre tableau où l'index de la colonne correspondra à l'index du questionnaire et pareil pour la ligne. Donc le rdn15_2 se trouvera dans la ligne 15, colonne 2 du questionnaire et dans la cellule (15,2) du tableau.

    Cordialement.

  15. #15
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Salut,

    Ton premier message d'erreur me dit que tu dois avoir utilisé Checked sur la chaine représentant un de tes radio bouton.
    La solution, c'est de balayer tous les controls de ton formulaire à la recherche du radiobouton appelé X ou dont le texte est Y. C'est à toi de savoir s'ils ont tous un texte différent.
    quelquechose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    private bool radioboutonchecked(string nom /*texte*/)
    {
      foreach (control c in TonFormulaire.controls)
      {
        if (c is radiobouton)
        {
          radiobutton r = c as radiobutton;
          if (r.text == ton-text /* r.name == tonmon */)
          {
            return r.checked;
          }
        }
      }
    return false;
    }
    c'est du c#, tu n'auras qu'à le transposer en vb. La logique est là en tout cas...

  16. #16
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Julien V Voir le message
    Bonjour,

    Comment sont placés vos RadioButton ?
    Sont-ils tous dans le même TableLayoutPanel ?

    Si c'est le cas alors il suffit d'utiliser la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Dim TableauRdn(100, 2) As RadioButton
            Dim LigneColonne() As String
            Dim Chaine As String
            For Each rdb As RadioButton In TableLayoutPanel1.Controls
                ' attributation de chaque RadioButton dans le tableau
                Chaine = rdb.Name.Substring(3)
                LigneColonne = Chaine.Split("_")
                TableauRdn(LigneColonne(0), LigneColonne(1)) = rdb
            Next
    Quelque soit leur place, leur position, il suffit que leur nom soit toujours construit de la même manière : commencer par "rdn" (ou trois lettres) puis par le numéro de la ligne puis "_" et finir par le numéro de la colonne.

    TableauRdn devra avoir les dimensions adéquates pour recevoir les 350 RadioButton.

    Ne pas oublier que le tableau commence par l'index 0 donc si vos RadioButton commencent par 1, ça donnera une dimension vide...

    Cordialement.
    Pourriez vous réexpliquer votre code car je ne comprends pas comment il marche. J'ai essayé de l'utiliser mais je ne comprends pas à quoi correspond précisément chaque variable, pourriez vous mettre quelques commentaires Merci!

  17. #17
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Peut-être cela serait plus simple en utilisant TableLayoutPanel.GetPositionFromControl.
    D'autre part, il me semble que dans un contenair de control, on ne peut avoir qu'un seul radiobutton sélectionné. Donc je ne comprends pas comment dans le TableLayoutPanel on pourrait en sélectionner plusieurs... mais il y a peut-être une truc qui m'a échappé.

    Ceci étant dit, il ne faudrait quand même pas oublier que le .NET est un langage objet ... et qu'il y a sans doute plus simple et plus propre que de déterminer des données fonctionnelles (la réponse à une question dans ton cas) à partir de noms de control...

    Dans l'idée, ça n'est pas des RadioButton que tu géres, mais des questions avec des réponses possibles dont l'une est la réponse choisie.
    Les radiobutton et le Panel ne sont que de la représentation graphique et doivent le rester.

    Comme je me sens l'âme d'un pédagogue ce soir, je te propose d'essayer cela (tu créés un formulaire FormQuestionnaire et tu copies le code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    Option Explicit On
    Option Strict On
    Public Class FormQuestionnaire
     
        Private lQuestion As New List(Of Question)
     
        Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Dim gb As GroupBox
            Dim q As Question
     
            q = New Question("Ca marche ?")
            q.ReponsePossible.Add("Oui")
            q.ReponsePossible.Add("Non")
            lQuestion.Add(q)
            q = New Question("Alors c'est bien l'objet non ?")
            q.ReponsePossible.Add("Je sais pas trop...")
            q.ReponsePossible.Add("Boff")
            q.ReponsePossible.Add("C'est bien")
            q.ReponsePossible.Add("C'est coolissime")
            lQuestion.Add(q)
            q = New Question("Je file de suite lire de la doc sur la prog objet")
            q.ReponsePossible.Add("Oui")
            q.ReponsePossible.Add("Non")
            q.ReponsePossible.Add("Quand j'aurai 5 minutes à perdre pour gagner des heures")
            lQuestion.Add(q)
     
            For i As Integer = lQuestion.Count - 1 To 0 Step -1
                gb = New QuestionControl(lQuestion(i))
                Me.Controls.Add(gb)
                gb.Dock = DockStyle.Top
            Next
     
        End Sub
     
    End Class
     
    Public Class Question
        Public ReponsePossible As New List(Of String)
        Public Reponse As String
        Public Texte As String
        Public Sub New(ByVal T As String)
            Texte = T
        End Sub
    End Class
     
    Public Class QuestionControl
        Inherits GroupBox
     
        Dim qQuestion As Question
        Private lbReponse As Label
     
        Public Sub New(ByVal Q As Question)
     
            qQuestion = Q
     
            lbReponse = New Label
            lbReponse.AutoSize = True
            lbReponse.Text = qQuestion.Reponse
            lbReponse.Dock = DockStyle.Left And DockStyle.Bottom
            Me.Controls.Add(lbReponse)
     
            Dim intHeigth As Integer
            For i As Integer = qQuestion.ReponsePossible.Count - 1 To 0 Step -1
                Dim rb As New RadioButton
                rb.Tag = i
                rb.Text = qQuestion.ReponsePossible(i)
                rb.AutoSize = True
                rb.Dock = DockStyle.Left
                AddHandler rb.CheckedChanged, AddressOf ApplySelection
                Me.Controls.Add(rb)
                If rb.Height > intHeigth Then intHeigth = rb.Height
            Next
     
            Me.Text = qQuestion.Texte
            Me.AutoSize = False
            Me.Height = intHeigth - 30
     
        End Sub
     
        Private Sub ApplySelection(ByVal sender As Object, ByVal e As EventArgs)
            If CType(sender, RadioButton).Checked Then
                qQuestion.Reponse = CType(sender, RadioButton).Text & " : " & CType(sender, RadioButton).Tag.ToString
                lbReponse.Text = qQuestion.Reponse
            End If
        End Sub
    End Class
    Dans l'idée, on gére des Questions, donc on créé une classe Question avec une list de réponse possible dont l'une d'entre elle constitue la réponse choisie.

    Pour la réprésentation graphique, on créé un control graphique hérité de groupbox (pratique pour encapsuler les radiobutton) qui à partir d'une question se construit tout seul.

    Il suffit simplement alors dans la form de créer une liste de question et d'ajouter les controls graphiques correspondant.

    Le code n'est pas d'un pureté redoutable mais ça donne une peu l'idée de ce que l'on peut faire sans trop de mal ...

    A voir donc.

    Cdt.

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    ça y est! je pense avoir enfin trouvé une ébauche de solution après XXX tentatives...

    Pour chaque question, j'ai mis mes radiobutton dans un tableLayoutPanel différent. Qui sont eux même dans un grand tableLayoutPanel.
    Voici mon début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            For each tlp as TableLayoutPanel in TableLayoutPanelprincipal.Controls
            	For Each rdn As RadioButton In tlp.Controls
    	            If rdn.Checked=True Then 
    	            	MsgBox(rdn.Name & " is checked ")
    	            	label1.text = label1.text & tlp.Name & " : " & rdn.Name
    	            Else
    	            	MsgBox(rdn.Name & " is not checked ")
    	            End If
                Next
            Next

    J'ai juste une question, est ce normal que mes différents TableLayoutPanel ne soit pas parcourus dans l'ordre?

    Merci encore pour votre aide

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Les TableLayoutPanel seront parcourus de gauche à droite et de haut en bas dans votre "TableLayoutPanelprincipal".

    Cordialement.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour Léa53,

    Qu'est ce qu'a donné votre projet alors ?

    Cordialement.

Discussions similaires

  1. [XL-2003] Fonction RECHERCHEV avec nom de variable en source
    Par brunop3165 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2011, 00h19
  2. Réponses: 1
    Dernier message: 03/03/2010, 03h41
  3. [Batch] Utiliser des caractères spéciaux dans les noms de variables?
    Par DeVit dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 09/10/2009, 11h33
  4. Get avec nom de variable
    Par sam01 dans le forum Administration système
    Réponses: 1
    Dernier message: 29/01/2008, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo