Problème d'autoremplissage sélectif

Résolu
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 - Modifié par 1ModdingMaster le 27/01/2014 à 23:40
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 29 janv. 2014 à 11:16
Bonjour, j'ai un gros problème que je n'arrive pas résoudre selon moi, malgré beaucoup de temps passé dessus avant de vous faire appel à l'aide, je pense que le titre n'est pas très bien explicite donc je vais détailler du mieux que je peux :

J'ai créé un programme de gestion, assez complexe, riche, je travaille depuis une bonne année dessus, je note par ailleurs la qualité de vos aides dont j'ai pu bénéficier lorsque j'en avais besoin autrefois. Ce programme de gestion à un but, cocher des cases (CheckBox) pour sélectionner des lignes précises à afficher (dans un Label), puis remplir une base temporaire (ComboBox) de noms choisis à faire afficher à la suite des lignes précises sélectionnées (dans le même Label). J'espère que jusque là tout va bien.

Mon problème survient au moment où je souhaite faire afficher mes noms depuis les différents ComboBox vers le Label à la suite des lignes précises déjà affichées. Le premier foctionne correctement, sans souci, si je l'active, le nom s'ajoute, si je le désactive, le nom disparait. Mais à partir du second élément, là, aïe ! Il répète tout simplement le même nom que le premier alors qu'il est censé dépendre d'un autre ComboBox qui n'est par ailleurs pas encore rempli. Et pareil pour le troisième, quatrième, et ainsi de suite jusqu'au douzième.

Voici un bout de code qui peut vous aider :

Label1.Text = "CommandButton Command_" + comboBox13.Text + "\r\n";

            foreach (Control c in TabControl1.TabPages[0].Controls.OfType<CheckBox>().OrderBy(c => c.TabIndex))
            {
                if (c is CheckBox && c.Tag != null && ((CheckBox)c).Checked)
                {
                    Label1.Text += "".PadRight(8) + c.Tag + "= ";

                    if (checkBox1.Checked == true)
                    {
                        Label1.Text += comboBox1.Text + "\r";
                    }

                    if (checkBox2.Checked == true)
                    {
                        Label1.Text += comboBox2.Text + "\r";
                    }
                }
            }

            Label1.Text += "End";


J'espère qu'il s'affichera correctement afin que vous puissiez le comprendre au mieux. Le problème tourne autour du "if (checkBox2.Checked == true).

Voilà, je ne peux en dire mieux pour le moment, si vous voulez quoique ce soit comme renseignement supplémentaire ou code, demandez-moi.

Un grand merci d'avance à celui ou ceux qui pourront m'aider sur ce problème, et je vous souhaite une bonne soirée.

9 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 21:39
Bon, pour n'avoir qu'une impression d'écran j'ai tout mis dans le même TabPage (clique sur l'image pour la voir en grand):


Il y a plusieurs types de contrôles, pour vérifier qu'on ne prend que ceux qu'il faut.

Voici le code, commenté le plus complètement possible:
            List<CheckBox> mesCasesCochees = tabControl1.TabPages[0].Controls.OfType<CheckBox>().Where(c => c.Checked && c.Tag != null).OrderBy(c => c.TabIndex).ToList<CheckBox>();
            //j'utilise plus de fonctions de Linq (tu avais déjà mis OfType et OrderBy):
                  //Where(c => c.Checked && c.Tag != null): plus besoin de tester ces paramètres c'est déjà filtré come il faut
                 //.ToList<CheckBox>(): caste la collection en List et les élements en CheckBox, donc ensuite il n'y a plus à s'en soucier.

            if (mesCasesCochees.Count == 0) return;//s'il n'y a rien dans la liste on sort de cette méthode

            StringBuilder str = new StringBuilder("CommandButton Command_");
            str.AppendLine(comboBox13.Text);//j'initie le stringbuilder avec la première ligne

            //ensuite dans ton foreach tu testes à chaque boucle tous tes checksbox,
            //il est donc logique qu'il te multiplie les lignes, il ne faut tester uniquement le checkbox de l'itération en cours:
            foreach (CheckBox c in mesCasesCochees)
                switch (c.Name)//switch est une sorte de if elseif en cascade, là je vais prévoir tous les cas possibles
                {
                    case "checkBox1":
                        str.AppendLine(string.Format("        {0}={1}", c.Tag, comboBox1.Text));//appendline ajoute une ligne avec /r/n à la fin
                        //string.Format retourne un string composé par du texte fixe et des arguments, les positions des arguments sont spécifiées par des index entre accolades
                        break;//on sort du switch

                    case "checkBox2":
                        str.AppendLine(string.Format("        {0}={1}", c.Tag, comboBox2.Text));
                        break;

                    case "checkBox3":
                        str.AppendLine(string.Format("        {0}={1}", c.Tag, comboBox3.Text));
                        break;

                    default://autres cas non prévus
                        throw new Exception("Erreur de CheckBox");//génère une exception
                        //pas de break, car avec throw on sort forcément de la méthode
                }

            str.Append("End");

            label1.Text = str.ToString();//j'envoie le string construit dans le textbox


Et le résultat, quand les 3 cases sont cochées et ont un tag
1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 21:40
J'ai fait ça un peu vite, je voie déjà comment optimiser.....
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 21:44
            List<CheckBox> mesCasesCochees = tabControl1.TabPages[0].Controls.OfType<CheckBox>().Where(c => c.Checked && c.Tag != null).OrderBy(c => c.TabIndex).ToList<CheckBox>();

            if (mesCasesCochees.Count == 0) return;//s'il n'y a rien dans la liste on sort de cette méthode

            StringBuilder str = new StringBuilder("CommandButton Command_");
            str.AppendLine(comboBox13.Text);

            foreach (CheckBox c in mesCasesCochees)
            {
                str.Append(string.Format("        {0}=", c.Tag));//cette partie est commune, donc pas la peine de l'écrire 3 fois....
                switch (c.Name)
                {
                    case "checkBox1":
                        str.AppendLine(comboBox1.Text);//on finalise en fonction de la case cochée
                        break;

                    case "checkBox2":
                        str.AppendLine(comboBox2.Text);
                        break;

                    case "checkBox3":
                        str.AppendLine(comboBox3.Text);
                        break;

                    default://autres cas non prévus
                        throw new Exception("Erreur de CheckBox");//génère une exception


                }
            }
            str.Append("End");

            label1.Text = str.ToString();

1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 23:25
            string chemin = string.Format("{0}\\test.txt",Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
            System.IO.File.WriteAllText(chemin, str.ToString());



N'oublie pas de mettre le sujet résolu si cela te convient.
1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 janv. 2014 à 07:39
Bonjour,
pour vider le label, au moment ou je regarde si la liste est vide:

            if (mesCasesCochees.Count == 0)
            {
                label1.Text = string.Empty;
                return;//s'il n'y a rien dans la liste on sort de cette méthode
            }


Pour les radioboutons
                        if (radioButton1.Checked) str.AppendLine("YES");
                        else str.AppendLine("NO");

1

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

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 17:25
Bonsoir, je ne comprends pas ce que tu cherches à faire.
Peux tu poster l'image de ton programme? Avec éventuellement des annotations?



PS il y a un bug pour la coloration syntaxique du csharp, quand on se sert de la liste déroulante il manque le s, à rajouter à la main en attendant la correction.
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
Modifié par 1ModdingMaster le 28/01/2014 à 19:27
Bonsoir, merci de bien vouloir m'aider, je pensais bien que je n'avais pas été très clair alors je vais réexpliquer (nb : tu m'a déjà aidé il y a environ un an sur un autre problème ;) ).

Alors, en gros, j'ai des CheckBox (à noter que je travaille sur une TabPage) sur le premier onglet, en sélectionnant ces CheckBox, j'active des TextBox sur le second onglet et je fais apparaitre des lignes en cinquième onglet sur un Label selon le nombre de CheckBox que j'ai validé, à l'aide d'un Tag. Jusque là je n'ai pas de problème.

Les TextBox activés en second onglet me permettent de remplir des ComboBox en troisième onglet (avant que j'utilise une base de données, mais je verrai cela plus tard). Là non plus pas de problème, le remplissage se fait correctement.

Mais, dès que je sélectionne une donnée dans un ComboBox pour la faire afficher dans le Label à la suite de la ligne créée en activant le CheckBox correspondant, là ça me fait des trucs bizarres. Certes, juste le premier fonctionne correctement.

Je post les images, en espérant que ça fonctionnera :

http://i55.servimg.com/u/f55/15/46/74/36/110.png

http://i55.servimg.com/u/f55/15/46/74/36/210.png

http://i55.servimg.com/u/f55/15/46/74/36/310.png

N'hésite pas à me demander quoique ce soit comme images, codes, etc... J'espère que tu comprendras. Merci pour l'aide.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 19:56
Pour poster tes images, tu peux te servir de l'icône dont j'ai mis l'image dans mon propre message.
Ça permet d'avoir les images dans le texte.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 20:03
Pour construire un texte multiligne, par morceaux, il existe le stringbuilder.
Avec ses propriétés Append et AppendLine, tu peux ajouter un bout de texte, ou un texte et une fin de ligne.
Il faut que je me penche plus avant sur ton protocole pour te répondre.
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
28 janv. 2014 à 20:21
Désolé, je n'ai pas l'icône dont tu parles, j'ai que l'icône de code. :)

Je te laisse le temps alors de voir ce que tu peux faire pour m'aider. J'espère seulement qu'il ne faudra pas trop modifier, car je ne suis pas un expert. :)

Merci quand même de te pencher sur le sujet.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
28 janv. 2014 à 20:45
Ha? l'ajout d'image est peut être lié à mon statut.
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
28 janv. 2014 à 21:30
Certainement, je confirme, mais c'est pas grave, c'est lisible quand-même ?
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
28 janv. 2014 à 22:12
C'est bien fait, je pense que ça ressemble à ça, j'ai plus qu'à essayer, j'avais pensé au Switch, mais je ne savais pas comment le mettre en place, je vais donc m'inspirer de ce que tu as fait. Merci.

NB : Est-ce que c'est possible d'exporter le contenu du Label ou du TextBox dans un fichier TXT que l'on créé. Je crois l'avoir fait un jour mais je ne me rappelle plus. Je peux le faire avec ce code-ci :

System.IO.File.WriteAllText(@"C:\Users\%Username%\Desktop\Test.txt", Label1.Text);


Merci pour ton aide. :)
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
28 janv. 2014 à 22:23
J'ai essayé, ça me créé un fichier, mais seulement si je remplace "%Username%" par mon nom d'utilisateur actuel, ce qui me bloque puisqu'il ne sera pas le même si je change d'ordinateur ou même de compte. Mais dans l'ensemble ça me répercute bien l'entité des données du Label1. :)
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
Modifié par 1ModdingMaster le 29/01/2014 à 00:20
Merci pour ce bout de code, il m'a l'air plus complet.

J'ai essayé ta technique pour le problème d'avant, elle est superbe, je ne sais comment te remercier, cependant il y a quelques points à régler quand-même, car cela induit en erreur.

1) Au démarrage de l'application le Label1 est vide, est dès que l'on sélectionne les CheckBox ça commence à se remplir, le problème est quand je désélectionne tout, trois lignes reste encore inscrites. Serait-il possible de réinitialiser le Label1 pour le coup ?

2) Du CheckBox1 au CheckBox13 le remplissage est parfait puisque ce sont des ComboBox, par contre du CheckBox14 au CheckBox18 inclus ce sont des RadioButton, et du coup je n'arrive pas à faire switcher entre un "Yes" et un "No". Aurais-tu une technique s'il te plait ?

Sinon après ces deux réponses le sujet sera résolu, merci encore de m'avoir aidé, sans toi j'aurai jamais trouvé, malgré le temps que j'ai passé dessus à essayer. Merci beaucoup Whismeril.

Bonne soirée.
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
29 janv. 2014 à 10:36
Voilà, c'est tout simple alors que je m'imagine quelque chose de compliqué. Merci mille fois.

Faut-il appuyer quelque part pour mettre le sujet en résolu ?
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 janv. 2014 à 11:16
Au dessus de ton premier message "Marquer Comme Résolu".
Il est dans mes attributions de pouvoir le faire, donc cette fois je m'en occupe
0
Rejoignez-nous