Accé au prop a l'aide d'une liste?

mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014 - Modifié par Whismeril le 21/02/2014 à 13:59
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 22 févr. 2014 à 18:40
Bonjour,
J'ai un object "obj", instancier et avec 5 (int) proprietés R1, R2, R3, R4 et R5
j'ai une liste de 5 texbox contenant des int tb_R1, tb_R3, tb_R3, tb_R4 et tb_R5

je veux a l'aide d'une seul boucle for (i = 0; i < 6; i++)
associer chaque element de ma list des textbox, a mon objec equivalent obj.R1
tb_R2 dans obj.R2
tb_R3 dans obj.r3
etc.

mon probleme c'est que je n'arrive pas a envoyer les contenus de mes textbox dans mes obj.R1 obj.R2 etc..

avec seulement 5 proprietés je peux faire une a une
obj.R1 = tb_R1
obj.R2 = tb_R2
etc..
mais si j'ai 50 textbox et 50 proprités, comment je fais ca automatiquement ?

merci de m'aider

Globals obj = new Globals();
List<TextBox> TbList = new List<TextBox>();
TbList.Add(tb_R1);
TbList.Add(tb_R3);
TbList.Add(tb_R9);
TbList.Add(tb_R13);

List<int> R_values = new List<int>();
R_values.Add(obj.R1);
R_values.Add(obj.R3);
R_values.Add(obj.R9);
R_values.Add(obj.R13);

R_values[i] = TbList[i].Text;
//----> ca ne marche pas, mon obj.R1 instancier ne garde pas la valeur... ?

9 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 06:28
Bonjour, utilise le binding.



1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 13:57
Et donc j'insiste va voir le lien que je t'ai proposé.
Si ca ne te convient pas reviens, en précisant pourquoi.
Si ça n'est pas assez clair, reviens demander des précisions.

PS je mets tes codes en couleurs c'est plus lisible
1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 21:24
Ca n'est pas bon.
D'abord a lieu d'avoir une variable clairement identifiée par son nom tu vas avoir un index dans une liste de string. Pas très relisible quand dans 6 mois ou un an tu remettras le nez dans ton projet.
Ensuite si une des ces variables est autre chose qu'un string (int, DateTime, double, etc...) tu devras la convertir à chaque fois que tu en auras besoin, pas glop non plus surtout si tu te trompes d'index....

L'idée de créer une classe qui va bien est bonne, c'est même exactement ce qu'il faut faire.
Ensuite, instances une instance de cette classe, éventuellement avec des valeurs par défaut (tu pourras ensuite passer la référence de cette instance d'un form à l'autre ou d'une classe à l'autre).

Il te reste reste à faire le lien avec chaque textbox, et c'est là que le binding entre en jeu.
Dans le tuto, je montre comment associer un textbox avec la propriété "Prenom" de la classe Personne.

Ensuite j'affecte une liste de personne au databindingsource, mais tu peux très bien affecter une instance spécifique.

Je reviens vers toi avec un exemple.

1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 21:42
la classe contact
    public class Contact
    {
        public string Nom { get; set; }

        public string Prenom { get; set; }

        public DateTime Naissance { get; set; }

        public string NomComplet
        {
            get { return  Prenom + " " + Nom; }
        }

        public override string ToString()
        {
            return string.Format("Je m'appelle {0} (1}", Prenom, Nom);
        }
    }
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 21:43
le formulaire à ton nom
    public partial class frmMickBristol : Form
    {
        public frmMickBristol()
        {
            InitializeComponent();
        }

        private void frmMickBristol_Load(object sender, EventArgs e)
        {
            Contact jeanSor = new Contact { Prenom = "Jean", Nom = "Sor", Naissance = DateTime.Parse("01/01/2000") };
            contactBindingSource.DataSource = jeanSor;
        }
    }
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 21:44
et le contenu de InitializeCompoment() (click droit/atteindre la définition)

    partial class frmMickBristol
    {
        /// <summary>
        /// Variable nécessaire au concepteur.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Nettoyage des ressources utilisées.
        /// </summary>
        /// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Code généré par le Concepteur Windows Form

        /// <summary>
        /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
        /// le contenu de cette méthode avec l'éditeur de code.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.label1 = new System.Windows.Forms.Label();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.label2 = new System.Windows.Forms.Label();
            this.textBox3 = new System.Windows.Forms.TextBox();
            this.label3 = new System.Windows.Forms.Label();
            this.contactBindingSource = new System.Windows.Forms.BindingSource(this.components);
            this.label4 = new System.Windows.Forms.Label();
            ((System.ComponentModel.ISupportInitialize)(this.contactBindingSource)).BeginInit();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(48, 32);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(29, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Nom";
            // 
            // textBox1
            // 
            this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.contactBindingSource, "Nom", true));
            this.textBox1.Location = new System.Drawing.Point(150, 29);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 1;
            // 
            // textBox2
            // 
            this.textBox2.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.contactBindingSource, "Prenom", true));
            this.textBox2.Location = new System.Drawing.Point(150, 72);
            this.textBox2.Name = "textBox2";
            this.textBox2.Size = new System.Drawing.Size(100, 20);
            this.textBox2.TabIndex = 3;
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(48, 75);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(43, 13);
            this.label2.TabIndex = 2;
            this.label2.Text = "Prénom";
            // 
            // textBox3
            // 
            this.textBox3.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.contactBindingSource, "Naissance", true));
            this.textBox3.Location = new System.Drawing.Point(150, 118);
            this.textBox3.Name = "textBox3";
            this.textBox3.Size = new System.Drawing.Size(100, 20);
            this.textBox3.TabIndex = 5;
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(48, 121);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(96, 13);
            this.label3.TabIndex = 4;
            this.label3.Text = "Date de naissance";
            // 
            // contactBindingSource
            // 
            this.contactBindingSource.DataSource = typeof(test.Contact);
            // 
            // label4
            // 
            this.label4.AutoSize = true;
            this.label4.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.contactBindingSource, "NomComplet", true));
            this.label4.Location = new System.Drawing.Point(92, 170);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(35, 13);
            this.label4.TabIndex = 6;
            this.label4.Text = "label4";
            // 
            // frmMickBristol
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(299, 239);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.textBox3);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.label1);
            this.Name = "frmMickBristol";
            this.Text = "frmMickBristol";
            this.Load += new System.EventHandler(this.frmMickBristol_Load);
            ((System.ComponentModel.ISupportInitialize)(this.contactBindingSource)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.BindingSource contactBindingSource;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.TextBox textBox3;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
    }
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 21:45
Affiche le formulaire, change le nom ou le prénom et observe si c'est ce que tu souhaites atteindre.
0
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
21 févr. 2014 à 21:47
ok merci, je vais essayer plus tard dans la soirée et je reviens vers toi mais merci d'avance, c'est bien sympa :)
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 févr. 2014 à 15:10
changement que j'effectue dans les textbox est maintenant assigné automatiquement a mes proprietés.

Exactement

A quel "moment" les valeurs sont assignées ?
La valeur du label a l'air de changer lors que je change de control dans la form?
oui

y a t-il moyen d'effectuer les changements seulement au click d'un bouton par exemple ?
de base non, mais tu peux avoir deux variables.
Ta principale et un clone
Tu affectes le clone au binding et quand tu cliques sur le bouton "valider" tu clones le clone vers le principal.

Attention
Contact c1 = new Contact();
....
Contact c2 = c1;

Cette séquence affecte "la référence" de c1 à c2, donc tout changement de l'un affecte l'autre.
Ca n'est pas le cas pour les types de base (int, string, double, en gros tous ceux qui apparaissent en bleu foncé), pour eux le signe = copie la valeur.
Donc tu écris une méthode qui va copier chaque type de base d'une classe dans une autre.
Si tu veux faire ça "propre" tu suis la structure de Icloneable, voir l'exemple ci dessous:

    public class Contact : ICloneable
    {
        public string Nom { get; set; }

        public string Prenom { get; set; }

        public DateTime Naissance { get; set; }

        public string NomComplet
        {
            get { return Prenom + " " + Nom; }
        }

        public override string ToString()
        {
            return string.Format("Je m'appelle {0} {1}", Prenom, Nom);
        }

        #region ICloneable Membres

        public Contact Clone()
        {
            return new Contact { Nom = this.Nom, Prenom = this.Prenom, Naissance = this.Naissance };//là j'ai un doute concernant naissance puisque le type est turquoise....
        }

        #endregion
    }
1

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

Posez votre question
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
Modifié par Whismeril le 21/02/2014 à 13:59
Bonjour,
Je ne suis pas expert donc pardon si je me trompe mais le binding est pour remplir une table de donnée?

ce que je veux faire c'est acceder aux prorietés d'un objet a partir d'une liste, préalablement declarés.

Du genre, mon objet obj a été instancié, et visible dans toute ma class "main",
Je voudrais faire une liste dans le "main" comportant les proprietés R1, R2, R3 etc, de mon objet instancier.
Et pouvoir modifer leurs valeures, en utilisant cette liste. En vue de faire un sorte de "serialisation"

example, dans le main je crée mon object
Globals obj = new Globals();

cet obj comporte des proprietés de type int R1, R3, R9 etc.

je crée une liste contenant des textbox
List<TextBox> TbList = new List<
TbList.Add(tb_R1);
TbList.Add(tb_R3);
TbList.Add(tb_R9);

je crée une liste contenant des int, 
List<int> R_values = new List<int>();
R_values.Add(obj.R1);
R_values.Add(obj.R3);
R_values.Add(obj.R9);

maintenant je veux associer mes texbox a mes int en fesant une boucle for

for (i = 0; i< 3 ; i++)
{
     R_values[i] = Convert.ToInt32(TbList[i].Text);
}

ceci ne provoque pas d'erreur mais ca ne change pas la valeur de obj.R1, obj.R3, obj.R9

Merci de votre aide...
0
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
21 févr. 2014 à 20:27
Salut,
J'ai bien suivi le tutoriel, et essayé de modifier l'exemple pour arriver a faire ce que je voudrais mais je butte.
J'ai l'impression que le Binding c'est relier source de donné a une destination, c'est pas ce que je veux faire.

je veux pouvoir acceder a des proprietés d'une classe, en utilisant une liste.

Dans mon exemple ci dessous, apres la boucle "for"
les proprietés de mon object mc ne sont pas modifer.
Je comprends pourquoi ca marche pas (enfin je crois), mais je sais pas comment faire pour que ca marche..

namespace test
{
public class Class1
{
public string MyProperty { get; set; }
public string MyProperty2 { get; set; }
public string MyProperty3 { get; set; }
}
public partial class Form1 : Form
{
Class1 mc = new Class1();
public Form1()
{
InitializeComponent();
Transfertdata();
}

private void Transfertdata()
{
List<string> ListSource = new List<string> { "111", "222", "333" };
List<string> ListDestionation = new List<string> { mc.MyProperty, mc.MyProperty2, mc.MyProperty3 };

for (int i = 0; i < 3; i++)
{
ListDestionation[i] = ListSource[i];
}
}
}
}
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 févr. 2014 à 20:51
Ha, il y a donc 2 questions en une?

List<string> ListDestionation = new List<string> { mc.MyProperty, mc.MyProperty2, mc.MyProperty3 };

Ceci va te remplir une liste avec le contenu des propriétés de mc et non te donner l'accès aux propriétés d'une instance spécifique de Class1.

Que veux tu faire au final (le besoin pas la solution que tu imagines)?
Ou sont passées tes textbox?
0
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
21 févr. 2014 à 21:06
oui desolé pour la confusion.
en fait je sais passer le contenu des textbox dans une list de string alors je voulais "alleger" l'exemple.

En fait dans mon project, j'ai une class "Globals" (instancié: gbl) ou je veux ranger toutes mes variables. (histoire que ca soit plus ranger et plus agreable a lire).

Dans ma Form principale, j'ai une quainzaine de textbox, contenant les variables en question.
L'utilisateur peut alors changer ces variables comme il veut, et quand il click "appliquer" alors je veux que les contenus de toutes les textbox sont assignées a mes variables en question.

Pour cela je pensais creer une list de 15 textbox, et une list des 15 variables de gbl.
Et a l'aide d'un simple "for" assigner toutes les strings d'une list a l'autre.
Une seule boucle alors suffirait.

Merci encore pour ton aide :)
0
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
22 févr. 2014 à 14:27
Salut,
J'ai essayé le code, oui ca ressemble pas mal a ce que je veux faire.
J'avais un peu du mal a comprendre mais apparement le changement que j'effectue dans les textbox est maintenant assigné automatiquement a mes proprietés.

J'ai une question cependant.
A quel "moment" les valeurs sont assignées ?
La valeur du label a l'air de changer lors que je change de control dans la form?
y a t-il moyen d'effectuer les changements seulement au click d'un bouton par exemple ?

Ceci est pour exemple si j'ai des calculs entre 2 textbox, je voudrais faire mon calcul seulement une fois les 2 text box validés.

Merci
0
mickbristol78 Messages postés 7 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 22 février 2014
22 févr. 2014 à 15:44
Oh, mmm le clonage ca sera peut etre pour quand je maitriserai un peu plus alors ;)

je vais essayé de travailler avec ton aide et je laisserai un message si j'ai d'autre problemes ou questions.

merci encore,
bon weekend
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 févr. 2014 à 18:40
Ca n'est pas compliqué, ceci
Contact toto = new Contact { Nom = "Sors", Prenom = "Jean", Naissance = uneDate };

est la même chose (en plus court) que:
Contact toto = new Contact ()
toto.Nom = "Sors";
toto.Prenom = "Jean";
toto.Naissance = uneDate;



Ensuite
Contact clone = monPrincipal.Clone();
crée un deuxième contact avec les mêmes données mais avec un instance différente.
0
Rejoignez-nous