Ajouter en série des données issues de CheckBox cochées

Résolu
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 - 29 janv. 2014 à 21:37
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 - 1 févr. 2014 à 22:57
Bonsoir, comme l'explique le titre, j'aurai besoin d'un système capable d'ajouter des données issues de plusieurs CheckBox cochées (en fait quand on coche un CheckBox, cela doit inscrire une donnée à la suite sur une même ligne).

Exemple : Si CheckBox1, CheckBox2, et CheckBox3, etc... sont cochées,

A une ligne, inscrire : Valeur de CheckBox1, valeur de CheckBox2, valeur de CheckBox3, etc...

A noter qu'un membre du forum m'a déjà fourni un système semblable mais qui cette fois inscrit ligne par ligne, là je dois inscrire les données sur une des lignes de ce système en plus.

Ce sujet est en lien avec celui résolu ici : http://codes-sources.commentcamarche.net/forum/affich-10018415-probleme-d-autoremplissage-selectif

Et voici des images détaillées pour aider :

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

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

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

Un grand merci d'avance à celui qui pourra m'aider dans cette tâche, j'ai déjà essayé de reproduire le système précédent (avec des Tags) pour celui-ci, j'obtiens des résultats mais pas ceux qui m'importent.

Bonne soirée. :)

4 réponses

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
30 janv. 2014 à 15:41
Bonjour

un code fait toujours ce qu'on lui demande
Quand je coche le CheckBox4, j'ai bien la ligne "Options = "

et oui tu as mis:
Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, ""));

AppendLine mets un retour à la ligne... Essaye ceci
Constructeur.Append(string.Format("        {0}= ", c.Tag));//tu vas écrire "      Option = " sans retour à la ligne


ensuite
                        if (checkBox21.Checked == true)//si tu n'as qu'une instruction avec un if, les accolades ne sont pas obligatoires
                            Constructeur.Append("ALLOW_ROCK_TARGET ");//ajoute simplement la consigne à la dernier ligne

                        if (checkBox22.Checked == true)
                            Constructeur.AppendLine("ALLOW_SHRUBBERY_TARGET ");

                        if (checkBox23.Checked == true)
                            Constructeur.AppendLine("CANCELABLE ");

                       //à ce moment là quelque soit la combinaison cochée il y a un espace en trop à la fin, donc on l'enlève:
                            Constructeur.Remove(str.Length - 1, 1);//si il y a 50 caractères, les indices vont de 0 à 49, donc on enlève l'indice 49




Je n'ai pas essayé mais ça doit se rapprocher de ce que tu souhaites.
On aurait aussi pu passer avec une List<string> et un string.Join

                        StringBuilder Constructeur = new StringBuilder();

                        List<string> options = new List<string>();//initialise une liste de string

                        if (checkBox21.Checked == true) options.Add("ALLOW_ROCK_TARGET");// ajoute une option si besoin

                        if (checkBox22.Checked == true)options.Add("ALLOW_SHRUBBERY_TARGET");
 
                        if (checkBox23.Checked == true)options.Add("CANCELABLE");

                        string mesOptions = string.Join(" ",options);//concatène avec des espaces en séparation

                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, mesOptions));//là je mest ma ligne complète dans le stringbuilder


Ca j'ai testé.
1
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
Modifié par Whismeril le 30/01/2014 à 15:45
Par contre le choix de Constructeur comme nom de variable n'est pas judicieux.
En effet ce terme désigne, la méthode qui est appelée au moment de l'initialisation d'une instance de classe.
Par exemple:
        public Form4()
        {
            InitializeComponent();
        }

est le constructeur de Form4.

Ça peut prêter à confusion, surtout quand tu poses une question sur le forum, les autres bénévoles qui n'ont pas suivi les précédentes conversations peuvent être déroutés
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
30 janv. 2014 à 18:09
Merci beaucoup, ça marche parfaitement, en effet il y a des techniques que je ne connais pas, je n'avais vraiment pas pensé à un List<string> et string.Join. Je ne sais pas comment tu fais pour connaitre autant de techniques et savoir laquelle utiliser, enfin, tu es peut-être dans le métier aussi. En tout cas merci beaucoup, les deux aides que tu m'a apporté étaient selon moi les plus dures, j'ai presque fini le logiciel que je voulais faire, je n'oublierai pas de noter l'aide que vous m'avez apporté le forum et toi-même, dans un formulaire "A propos". Il ne me reste plus qu'à alimenter les ComboBox sous base de données, mais ça je pense y arriver j'ai une méthode fonctionnelle. Voilà, merci beaucoup Whismeril. :)
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
30 janv. 2014 à 18:11
Au fait, un if( ) va évaluer que ce qui est dans la parenthèse est un bool qui vaut soit true soit false.
Par exemple
if (toto == tutu)
c'est le résultat de == qui est évalué.

Quand ce que l'on veut tester est un déjà bool, comme la propriété Checked, il n'y a pas besoin de le comparer avec ==.

if (checkBox22.Checked == true)
//peut s'écrire
if (checkBox22.Checked)

//de même
if (checkBox22.Checked == false)
//peut s'écrire
if (!checkBox22.Checked)


Je pense même que ça s'exécute plus vite puisqu'il y a une opération en moins
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
30 janv. 2014 à 18:16
De rien, et non je ne suis pas du métier, mais je pratique, et je continue à trouver mon bonheur ici ou ailleurs!
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
1 févr. 2014 à 22:57
Ah merci pour cette astuce Whismeril, je savais qu'on pouvait raccourcir une condition si elle était vrai, je l'ai appris en cours, mais je connais pas le principe avec le point d'exclamation. Niveau rapidité ça va, c'est pas un logiciel extrêmement compliqué que j'ai fait, mais ma foi si on peut toujours obtenir un gain de vitesse ou de taille de fichier, je suis preneur. Merci de tout l'aide que tu as pu m'apporter et que tu pourras m'apporter si j'ai encore des difficultés. :)
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
30 janv. 2014 à 06:30
Bonjour, le principe est exactement le même.
Il te suffit d'écrire une méthode qui retourne un string.
Cette méthode gérera tes checkbox de la même façon que pour la derniere question.
Si tu n'en as que trois, tu peux le faire avec des if.
Sinon mets les dans un groupbox, ou mets un truc en commun dans le nom de façon à pouvoir faire la requête de sélection avec la méthode Contains().

Tu construis ton string du même principe que précédemment. Et tu le retourne de façon à ce qu'il intègre la construction générale.
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 30/01/2014 à 12:42
Bonjour,

J'ai beau essayé je dois mal m'y prendre, j'ai fait cela :

foreach (CheckBox c in LesCasesCocheesActions)
                switch (c.Name)
                {
                    case "checkBox1":
                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, comboBox1.Text));
                        button19.Enabled = true;
                        Button1.Enabled = true;
                        Button2.Enabled = true;
                        break;

                    case "checkBox2":
                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, comboBox2.Text));
                        button19.Enabled = true;
                        Button1.Enabled = true;
                        Button2.Enabled = true;
                        break;

                    case "checkBox3":
                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, comboBox3.Text));
                        button19.Enabled = true;
                        Button1.Enabled = true;
                        Button2.Enabled = true;
                        break;

                    case "checkBox4": // C'est celui que tu avais fait
			List<CheckBox> LesCasesCocheesOptions = TabControl1.TabPages[3].Controls.OfType<CheckBox>().Where(c2 => c2.Checked && c2.Tag != null).OrderBy(c2 => c2.TabIndex).ToList<CheckBox>();

            		if (LesCasesCocheesOptions.Count == 0)
            		{
                		Label1.Text = "CommandButton Command_" + "\r\n" + "End";
                		return;
            		}

            		StringBuilder str2 = new StringBuilder("CommandButton Command_");

			foreach (CheckBox c2 in LesCasesCocheesOptions)
			{
				switch (c2.Name)
				{
					case "checkBox21":
                        			str2.AppendLine(string.Format("        {0}= {1}", c.Tag, c2.Tag));
                        			break;

					case "checkBox22":
                        			str2.AppendLine(string.Format("        {0}= {1}", c.Tag, c2.Tag));
                        			break;

					case "checkBox23":
                        			str2.AppendLine(string.Format("        {0}= {1}", c.Tag, c2.Tag));
                        			break;

                    			default:
                        			throw new Exception("Erreur Inattendue !");
                		}

            			str2.Append("End");

            			Label1.Text = str2.ToString();
			}
                        break;

                    case "checkBox5":
                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, comboBox4.Text));
                        button19.Enabled = true;
                        Button1.Enabled = true;
                        Button2.Enabled = true;
                        break;


J'ai pas mis le reste, c'est le même que l'autre code que tu as fait.

Mais je pense que cette technique n'est pas du tout bonne, en plus ça fait du ligne par ligne et non de l'inscription de données en série.

Si tu peux m'aider s'il te plaît Whismeril... :)
0
1ModdingMaster Messages postés 30 Date d'inscription jeudi 7 juillet 2011 Statut Membre Dernière intervention 8 septembre 2014 1
30 janv. 2014 à 13:41
Attend, oubli l'ancien message, je viens d'essayer autre chose, ça ne correspond pas à mes attentes non plus, mais peut-être que je suis sur la bonne voie, tu me dira, je viens d'essayer ceci :

                    case "checkBox4":
                        Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, ""));

                        if (checkBox21.Checked == true)
                        {
                            Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, "ALLOW_ROCK_TARGET"));
                        }

                        if (checkBox22.Checked == true)
                        {
                            Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, "ALLOW_SHRUBBERY_TARGET"));
                        }

                        if (checkBox23.Checked == true)
                        {
                            Constructeur.AppendLine(string.Format("        {0}= {1}", c.Tag, "CANCELABLE"));
                        }

                        break;


Alors ce qu'il ne va pas :

- Quand je coche le CheckBox4, j'ai bien la ligne "Options = " qui s'affiche, mais elle est vide et c'est normal puisque je n'ai pas encore coché les options correspondantes.

- Quand je coche le CheckBox21, j'ai bien une inscription qui se réalise, mais il m'ajoute une ligne en dessous de l'autre déjà existante, or ce n'est pas ce que je recherche, mais je touche au but, il me faudrait juste une correction je pense.

- Pareil quand je coche CheckBox22...

Voilà le résultat si je coche les CheckBox21, CheckBox22, et CheckBox23 :

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

Et voilà ce que je devrais obtenir :

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

Finalement ta technique en utilisant des conditions ne semble pas mauvaise, mais il faut peaufiner un peu je pense.

Merci en tout cas de m'avoir mis sur la voie, j'étais parti sur autre chose de très compliqué. :)
0
Rejoignez-nous