Bouton radio dynamique

Résolu
sradhouan Messages postés 5 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 26 janvier 2010 - 14 déc. 2009 à 17:23
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?

5 réponses

JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
14 déc. 2009 à 19:50
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)
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
15 déc. 2009 à 10:24
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)
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
14 déc. 2009 à 19:54
..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)
0
sradhouan Messages postés 5 Date d'inscription samedi 18 avril 2009 Statut Membre Dernière intervention 26 janvier 2010
14 déc. 2009 à 20:00
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!
0

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

Posez votre question
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
Merci sa marché
0
Rejoignez-nous