IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Combobox liée a un ArrayList


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut Combobox liée a un ArrayList
    Bonjour,

    Je n'arrive pas a raffraichir mon combobox apres l'ajout d'un élément dans mon ArrayList.
    Quelqu'un aurait-il une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
                this._reviewList = new ArrayList();
     
                BookReview br = new BookReview();
                br.Author = "moi";
                this._reviewList.Add(br);
     
                BookReview br2 = new BookReview();
                br2.Author = "il";
                this._reviewList.Add(br2);
     
                BookReviewList.DataSource = this._reviewList;
                BookReviewList.DisplayMember = "Author";
     
                BookReview br1 = new BookReview();
                br1.Author = "toi";
                this._reviewList.Add(br1);
     
                BookReviewList.Refresh();
    "Moi" et "il" sont bien affiché mais pas le "toi".


    Yoshio

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Passes par un bindingSource


    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
                this._reviewList = new ArrayList();
     
                BookReview br = new BookReview();
                br.Author = "moi";
                this._reviewList.Add(br);
     
                BookReview br2 = new BookReview();
                br2.Author = "il";
                this._reviewList.Add(br2);
     
                BindingSource bs = new BindingSource();
                bs.DataSource = this._reviewList;
     
                BookReviewList.DataSource = bs;
                //BookReviewList.DataSource = this._reviewList;
                BookReviewList.DisplayMember = "Author";
     
                BookReview br1 = new BookReview();
                br1.Author = "toi";
                this._reviewList.Add(br1);
     
                // BookReviewList.Refresh();
                bs.ResetBindings(false);
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    On a même plus besoin d'un ArrayList alors.

    Je rencontre un autre problème maintenant.
    Si je fais ceci ca marche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                this._reviewList = new BindingSource();
     
                this._reviewList.Add(new BookReview("test","test",DateTime.Now,"test"));
     
                BookReviewList.DataSource = this._reviewList;
                BookReviewList.DisplayMember = "Author";
     
                this._reviewList.Add(new BookReview("test2","test2",DateTime.Now,"test2"));
     
                // BookReviewList.Refresh();
                this._reviewList.ResetBindings(false);
    Si j'enleve le premier Add ca marche plus. Au lieu de voir la liste je vois "NomDuProjet.BookReviewList" comme seul élément de ma liste.
    Donc quand la liste est vide et que j'ajoute un élément ca foire. Mais pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                this._reviewList = new BindingSource();
     
                BookReviewList.DataSource = this._reviewList;
                BookReviewList.DisplayMember = "Author";
     
                this._reviewList.Add(new BookReview("test2","test2",DateTime.Now,"test2"));
     
                // BookReviewList.Refresh();
                this._reviewList.ResetBindings(false);

  4. #4
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        this._reviewList = new BindingSource();
               _reviewList.DataMember = "Author";
     
                BookReviewList.DataSource = this._reviewList;
                BookReviewList.DisplayMember = "Author";
     
                this._reviewList.Add(new BookReview("test2","test2",DateTime.Now,"test2"));
     
                // BookReviewList.Refresh();
                this._reviewList.ResetBindings(false);
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  5. #5
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Fait que _reviewList soit une bindinglist au lieu d'une list/arraylist. De cette facon tu n'est pas obliger de faire un resetbindings. Qui est lourd pour rien.

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Yoshio Voir le message
    "Moi" et "il" sont bien affiché mais pas le "toi".Yoshio
    en deux mots : arraylist (list<T> itou, d'ailleurs) est une collection basique. A part en re-regardant son contenu, il est impossible de savoir si elle a subi un changement. Ta combo n'a aucun moyen de savoir que tu as ajouté un élément à ta liste.

    La solution ? si tu veux que ta combo reflète fidèlement l'état de ta liste, il faut qu'elle balance des events de notification. Les contrôles, comme les combos, ayant une propriété "DataSource" ont des comportemnts différents selon les fonctionnalités offertes par cette dernière.

    Je te laisse fouiller dans la MSDN les noms de "BindingList" (ou "ObservableCollection si tu est en .Net >3), "IBindingList", "IBindingListSource" et de "INotifyPropertyChanged", entre autres, pour te laisser entrer dans le monde merveilleux du binding d'UI sur du métier en .net

  7. #7
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    J'ai changé le ArrayList bêtement en BindingList comme The_badger_man me l'avais dit. Ca marche plutot bien.

    Par contre j'ai un autre problème. Quand je n'ai pas d'éléments dans ma bindinglist avant de la lier au combobox et que j'ajoute un élément par un textbox/bouton, ca ne rempli pas le combobox correctement. Ca met à la place du membre "Author" : "NomDuProjet.BookReview".

    Si maintenant j'avais deja un élément dans la bindinglist, je n'ai pas ce problème ca se remplit correctement.

    RideKick m'a alors suggérer une solution qui marche mais je ne sait pas si c'est bien propre.
    Il m'a dit de rajouter ce code ci et ca marche nikel, mais ca me semble un peu lourd.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this._reviewList.ListChanged += new ListChangedEventHandler(reviewList_ListChanged);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void reviewList_ListChanged(object sender, ListChangedEventArgs e)
            {
                if (this._reviewList.Count > 0)
                {
                    BookReviewList.DataSource = this._reviewList;
                    BookReviewList.DisplayMember = "Author";
                }
                else
                    BookReviewList.DataSource = null;
            }

  8. #8
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Par défaut
    Citation Envoyé par Yoshio Voir le message
    J'ai changé le ArrayList bêtement en BindingList comme The_badger_man me l'avais dit. Ca marche plutot bien.

    Par contre j'ai un autre problème. Quand je n'ai pas d'éléments dans ma bindinglist avant de la lier au combobox et que j'ajoute un élément par un textbox/bouton, ca ne rempli pas le combobox correctement. Ca met à la place du membre "Author" : "NomDuProjet.BookReview".

    Si maintenant j'avais deja un élément dans la bindinglist, je n'ai pas ce problème ca se remplit correctement.

    RideKick m'a alors suggérer une solution qui marche mais je ne sait pas si c'est bien propre.
    Il m'a dit de rajouter ce code ci et ca marche nikel, mais ca me semble un peu lourd.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this._reviewList.ListChanged += new ListChangedEventHandler(reviewList_ListChanged);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void reviewList_ListChanged(object sender, ListChangedEventArgs e)
            {
                if (this._reviewList.Count > 0)
                {
                    BookReviewList.DataSource = this._reviewList;
                    BookReviewList.DisplayMember = "Author";
                }
                else
                    BookReviewList.DataSource = null;
            }

    Non non c'est de la balle !
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  9. #9
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Citation Envoyé par Yoshio Voir le message
    J'ai changé le ArrayList bêtement en BindingList comme The_badger_man me l'avais dit. Ca marche plutot bien.

    Par contre j'ai un autre problème. Quand je n'ai pas d'éléments dans ma bindinglist avant de la lier au combobox et que j'ajoute un élément par un textbox/bouton, ca ne rempli pas le combobox correctement. Ca met à la place du membre "Author" : "NomDuProjet.BookReview".

    Si maintenant j'avais deja un élément dans la bindinglist, je n'ai pas ce problème ca se remplit correctement.

    RideKick m'a alors suggérer une solution qui marche mais je ne sait pas si c'est bien propre.
    Il m'a dit de rajouter ce code ci et ca marche nikel, mais ca me semble un peu lourd.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this._reviewList.ListChanged += new ListChangedEventHandler(reviewList_ListChanged);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void reviewList_ListChanged(object sender, ListChangedEventArgs e)
            {
                if (this._reviewList.Count > 0)
                {
                    BookReviewList.DataSource = this._reviewList;
                    BookReviewList.DisplayMember = "Author";
                }
                else
                    BookReviewList.DataSource = null;
            }

    Jene comprend pas trop ton probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    private BindingList<Person> _persons;
    				public BindingList<Person> Persons
    				{
    					get 
    					{
    						if (_persons == null) _persons = new BindingList<Person>();
    						return _persons; 
    					}
    				}
     
     
    				private void button1_Click(object sender, EventArgs e)
    				{
    					BindingSource bs = new BindingSource();
    					bs.DataSource = Persons;
    					comboBox1.DataSource = bs;
    					comboBox1.DisplayMember = "Name";
    				}
     
    				public class Person
    				{
    					public Person()
    					{ }
     
    					public Person(string name)
    					{ Name = name; }
     
    					private string _name;
    					public string Name
    					{
    						get { return _name; }
    						set  { _name = value; }
    					}
    				}

    Tu oublierais pas de mettre le displaymember meme quand ya rien dans ta bindinglist

  10. #10
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Par défaut
    Tu oublierais pas de mettre le displaymember meme quand ya rien dans ta bindinglist
    Non c'est mis.

    C'est pascompliquer le problem, quand la liste est vide ca s'affiche mal apres un ajout. Quand la liste n'est pas vide ca s'affiche bien après un ajout.

Discussions similaires

  1. effacer contenu d'une combobox liée
    Par christi dans le forum Windows Forms
    Réponses: 13
    Dernier message: 04/02/2009, 17h25
  2. Combobox liées entre elles
    Par Psychoze dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/03/2008, 13h30
  3. Combobox liées aux precdentes
    Par titeZ dans le forum IHM
    Réponses: 1
    Dernier message: 01/10/2007, 19h07
  4. [c#][.NET 2.0] Datagrid avec 2 combobox liées entre elles
    Par axl63800 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/04/2007, 09h31
  5. [VB.net 2005]ComboBox.DataSource ignore l'ArrayList source
    Par Macintoc dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/08/2006, 19h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo