Bouton radio dynamique [Résolu]

Messages postés
5
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
26 janvier 2010
- - Dernière réponse : sradhouan
Messages postés
5
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
26 janvier 2010
- 15 déc. 2009 à 13:27
Bonjour j'ai un petit soucis:
je veux faire des boutons radio selon le nombre de choix que j'ai le nombre de choix est dans List_nbr
bon voila le code dans le fichier Form2.cs
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public DateTime début = DateTime.Now;
        ArrayList liste new ArrayList(); ArrayList questionvue new ArrayList(); ArrayList liste_nbr = new ArrayList();
        ArrayList indicerep new ArrayList(); int i 0; string j = ""; int nbr = 0;
        bool dejavu false; int note 0; int rang = 0; int fin = 0;
        public Form2(String a1,String a2,String a3,String a4)
        {
            InitializeComponent();
            label1.Text a1;//nom de la matiére nom du fichier xml
            label2.Text = a2; 
            label3.Text = a3;
            label4.Text = a4;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form2_Load(object sender, EventArgs e)
        {
           

            XPathDocument doc = new XPathDocument(label1.Text+".xml");
            XPathNavigator nav = doc.CreateNavigator();
            // On récupère un XPathNodeIterator sur les Record
            XPathNodeIterator iter = nav.Select("QCM/questions");
            // Pour chaque Record
            try
            {
                
                button1.Enabled = false;
                while (iter.MoveNext())
                {
                    // On récupère l'info 
                    string v1 = iter.Current.SelectSingleNode("quest").Value;
                    string v2 = iter.Current.SelectSingleNode("prop1").Value;
                    string v3 = iter.Current.SelectSingleNode("prop2").Value;
                    string v4 = iter.Current.SelectSingleNode("prop3").Value;
                    string v6 = iter.Current.SelectSingleNode("prop4").Value;
                    string v7 = iter.Current.SelectSingleNode("prop5").Value;
                    if (v4 == "")
                        nbr = 3;
                    else if (v6 == "")
                        nbr = 4;
                    else if (v7 == "")
                        nbr = 5;
                    else nbr = 0;
                    

                    string v5 = iter.Current.SelectSingleNode("rep").Value;//indice réponse exacte
                    string s = Environment.NewLine + v1 + Environment.NewLine + Environment.NewLine + v2 + Environment.NewLine + Environment.NewLine + v3 + Environment.NewLine + Environment.NewLine + v4 + Environment.NewLine + Environment.NewLine + v6 + Environment.NewLine + Environment.NewLine + v7 + Environment.NewLine;
                    liste.Add(s);
                    liste_nbr.Add(nbr);//ICI LA RECUPERATION DE NOMBRE DE CHOIX
                    indicerep.Add(v5);
                    textBox1.Text = "Cliquez sur commencer pour voir les questions" + Environment.NewLine + "La durée de l'examen est : 30 minutes" + Environment.NewLine + "Le nombre de questions est :" + liste.Count + Environment.NewLine ;
                   
                }
                
            }
            catch { }
            


        }

      //..................
    }
}

Voila le code dans Form2.Designer.cs*
//...................
            this.radioButton5 = new System.Windows.Forms.RadioButton();
            this.radioButton4 = new System.Windows.Forms.RadioButton();
            this.radioButton3 = new System.Windows.Forms.RadioButton();
            this.radioButton2 = new System.Windows.Forms.RadioButton();
            this.radioButton1 = new System.Windows.Forms.RadioButton();
//...........
this.groupBox1.Controls.Add(this.radioButton5);
this.groupBox1.Controls.Add(this.radioButton4);
this.groupBox1.Controls.Add(this.radioButton3);
this.groupBox1.Controls.Add(this.radioButton2); this.groupBox1.Controls.Add(this.radioButton1);

or moi je veux pas que
this.groupBox1.Controls.Add(this.radioButton5);
this.groupBox1.Controls.Add(this.radioButton4);
que sa s'exécute sauf si le nombre de reponse est 5 ou bien 4 donc je veux que sa soit dynamique selon List_nbr
Ma solution

J'ai pensé à mettre
this.groupBox1.Controls.Add(this.radioButton5);
this.groupBox1.Controls.Add(this.radioButton4);
dans une condition "if" mais comment récupéré list_nbr[i] depuis de Form2.Designer.cs* et est ce que elle va etre rafraichi à chaque question?
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
142
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
3
Merci
Salut,

Si je comprends bien tu as un seul groupbox, que tu rafraichis pour chaque question... je pars de cette hypothèse pour les solutions qui suivent.

Première chose, je trouve que tu te compliques beaucoup. Voici une autre façon de faire, plus "propre" (et moins de code!):

Création d'une nouvelle classe (objet Question):
    class Question
    {
        public string Libelle;
        public int Reponse;
        public List<string> Propositions;

        public Question(XPathNavigator aQuest)
        {
            Libelle = aQuest.SelectSingleNode("quest").Value;
            Reponse = aQuest.SelectSingleNode("rep").ValueAsInt;
            Propositions = new List<string>();
            for (int i = 1; i < 6; i++)
            {
                string prop = aQuest.SelectSingleNode("prop" + i.ToString()).Value;
                if (prop != "") Propositions.Add(prop);
            }
        }
    }


Ajout d'un attribut dans le formulaire:
List<Question> Questions;


Appel dans le formulaire:
        private void button1_Click(object sender, EventArgs e)
        {
            XPathDocument doc = new XPathDocument(label1.Text + ".xml");
            XPathNavigator nav = doc.CreateNavigator();
            // On récupère un XPathNodeIterator sur les Record
            XPathNodeIterator iter = nav.Select("QCM/questions");

            Questions = new List<Question>();
            // Pour chaque Record
            try
            {

                button1.Enabled = false;
                while (iter.MoveNext())
                {
                    Questions.Add(new Question(iter.Current));
                }
            }
            catch { }
            textBox1.Text = "Cliquez sur commencer pour voir les questions" + Environment.NewLine + "La durée de l'examen est : 30 minutes" + Environment.NewLine + "Le nombre de questions est :" + Questions.Count + Environment.NewLine;
        }


Ensuite, c'est bien de créer des contrôles dynamiquement, mais dans ton cas précis je pense qu'il vaut mieux laisser les 5 par construction et rendre invisibles ceux qui ne te servent pas, au lieu de les recréer à chaque fois.

1- Tu laisses tes 5 boutons, et tu les rends invisibles si besoin (exemple pour 1 question, il faut mettre ça dans une boucle pour itérer sur toute la liste):
            //itération: Question quest = Questions[i];
            //ou boucle foreach(Question quest in Questions)
            ...
            for (i = 1; i < 6; i++)
            {
                if (quest.Propositions.Count<= i)  //si il existe une i-ème proposition
                {
                    //on rend le bouton visible
                    ((RadioButton)(groupBox1.Controls.Find("radioButton" + i.ToString(), true)[0])).Visible=true;
                    //et on affiche le texte de la proposition
                    ((RadioButton)(groupBox1.Controls.Find("radioButton" + i.ToString(), true)[0])).Text = quest.Propositions[i];
                }
                else  //sinon
                {
                    ((RadioButton)(groupBox1.Controls.Find("radioButton" + i.ToString(), true)[0])).Visible=false;
                }
            }


Bonne continuation!

Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)

Dire « Merci » 3

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

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

Commenter la réponse de JeremyLecouvert
Messages postés
142
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
3
Merci
Salut,
Y'a une petite erreur dans mon code (problème d'indice!):
...
  //et on affiche le texte de la proposition
  ((RadioButton)(groupBox1.Controls.Find("radioButton" + i.ToString(), true)[0])).Text = quest.Propositions[i-1];
...


C'est mieux comme ça!

Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)

Dire « Merci » 3

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

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

Commenter la réponse de JeremyLecouvert
Messages postés
142
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
0
Merci
..Oups, j'ai oublié la réponse... pour la récupérer, il te suffit de faire:
string textreponse = quest.Propositions[quest.Reponse-1];


@+.

Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
Commenter la réponse de JeremyLecouvert
Messages postés
5
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
26 janvier 2010
0
Merci
Merci pour ta réponse, pour rendre visible bouton si une belle idée, je vais l'essayé car je suis un débutant en c# et si je trouverais une chose qui n'est pas claire je vais t'informer merci encore une fois pour ta réponse!
Commenter la réponse de sradhouan
Messages postés
5
Date d'inscription
samedi 18 avril 2009
Statut
Membre
Dernière intervention
26 janvier 2010
0
Merci
Merci sa marché
Commenter la réponse de sradhouan