Lier une liste d'objets à une listbox

Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Bonjour,
je cherche à lier simplement une liste d'objets à une listbox. Par exemple si j'ai une liste de personne, j'aimerais afficher les noms de mes personne dans la listbox et que si je modifoe ces noms dans la listbox, les propriétés des objets soient elles aussi modifiées. Je sais faire ce type de liaison quand il n'y a qu'un controle et une propriété à lier (databinding), mais comment fait-on avec une liste d'objet et un composant comme une listbox ?

merci d'avance pour votre aide.
Mathmax

7 réponses

Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
Salut,
Le texte d'un objet affiché dans une listbox est celui renvoyé par la méthode ToString de cet objet. Il te suffit donc de déclarer ToString dans ta classe Personne, ensuite pour les ajouter à la listbox, il te suffit de faire Listbox1.Items.Add(Joe);
Ensuite il n'y a plus de lien à faire, lorsque tu voudras modifier les textes de ta listbox, tu feras (excuse moi je fais du vb, mais j'imagine que c'est pareil en C#)
CType(Listbox1.Items(index), Personne).Name = "Joe";
(En supposant que la méthode ToString renvoie le Name de l'objet personne...)

Julien.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
((Personne)Listbox1.Items[index]).Name en C#

Mx
MVP C# 
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
Que je suis bête, CType() en C# ! Il s'agit d'un opérateur en VB pour faire un conversion de type, en C#, tu dois bien évidemment plutôt faire

((Personne) Listbox1.Items(index)).Name = "Joe";

Julien.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Non, les indexeurs sont les crochets et pas les parenthèses...
Voire solution de Mx.

<hr />
-Blog-
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Merci,
Je vois aussi qu'il y a une propriété datasource. Par contre il semble que je doivent rédéfinir les propriétées DataSource,DisplayMember et ValueMember à chaque fois que je modifie ma liste d'objet. Je veux dire qu'une modification de la liste d'objet, n'entraine pas une modification de l'affichage dans ma ListBox. Est-ce normal ?

Mathmax
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
j'avais posté ça il y a quelques temps : http://www.csharpfr.com/codes/UTILISATION-COMBOBOX-DATABINDING-OBJECT_34338.aspx

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Merci pour ta réponse sebmafate.
Ton exemple illustre bien mon problème. Voilà ce que j'aurais aimé pouvoir écrire :

        public Form1()
        {
            InitializeComponent();

            RemplissageCboManual();
            RemplissageDataBinding();

            cboBinding.DataSource = listUser;
            cboBinding.DisplayMember = "Nom";
            cboBinding.SelectedIndexChanged += new EventHandler(cboBinding_SelectedIndexChanged);
            cboManual.SelectedIndexChanged += new EventHandler(cboBinding_SelectedIndexChanged);
        }

        private void RemplissageDataBinding()
        {
            listUser = new ArrayList();
            Personne pers;
           
            pers = new Personne("Maf", "Sébastien",
                1976, 0);
            listUser.Add(pers);
            pers = new Personne("MX", "Morpion",
                1983, 1);
            listUser.Add(pers);
            pers = new Personne("Monpoulet", "Coq",
                1982, 2);
            listUser.Add(pers);
            pers = new Personne("Lefree", "Man",
                1985, 3);
            listUser.Add(pers);
        }

c'est à dire lier une fois cboBinding à listUser puis que à chaque réafection de listUser, cboBinding se mettent automatiquement à jour. Apparament ce n'est pas possible. Il semble qu'il faille redéfinir les propriétés DataSource  et DisplayMember à chaque fois qu'on affecte à listUser une nouvelle ArrayList. J'ai essayé en remplacant le type ArrayList par un type BindingList mais ça ne change rien... une idée ?

merci

Mathmax