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

C# Discussion :

Databinding et thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut Databinding et thread
    Bonjour,

    J'ai une listbox bindée à une collection List<string>.
    Lorsque je modifie ma collection dans un thread qui n'est pas le thread du formulaire, le databinding ne gère plus la mise à jour de la listbox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            List<string> values;
     
            private void Form1_Load(object sender, EventArgs e)
            {
                values = new List<string> { "aaa", "bbb", "ccc" };
                listBox1.DataSource = values;
     
                Thread th = new Thread(() => values.Add("ddd"));
     
                th.Start();
            }

    Pour mettre à jour ma listbox je n'ai trouvé de mieux que d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                BindingContext[values].SuspendBinding();
                BindingContext[values].ResumeBinding();
    Auriez-vous une meilleure idée ?


    merci d'avance pour vos conseils.

    mathmax

  2. #2
    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
    A vue de nez, ton problème n'a aucun lien avec les threads, non ? Vu que les listes ne sont pas faites pour du binding "dynamique" (i.e. elles n'ont aucun Event de notification d'ajout / modif / suppression / etc.), tes contrôles dont la datasource est une List<> n'ont pas moyen de savoir qu'elle a changé. Il faut donc forcer le refresh à la main, par exemple de la façon que tu as choisie.

  3. #3
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Oui en fait c'est vrai que dans mon exemple j'aurais dû mettre une BindingList.
    Mais ça ne change pas le problème. Celle-ci n'est pas mieux mise à jour.

  4. #4
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    J'ai trouvé la solution :

    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
     
            public static BindingList<string> values;
     
            private void Form1_Load(object sender, EventArgs e)
            {
                values = new BindingList<string> { "aaa", "bbb", "ccc" };
                listBox1.DataSource = values;
     
                Thread th = new Thread(() =>
                    {
                        Action dlgt = () => values.Add("ddd");
                        listBox1.Invoke(dlgt);
                    });
     
                th.Start();
            }
    Mais c'est un peu contraignant car je dois avoir connaissance de mon control dans le thread enfant...

  5. #5
    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
    La BindingListView a une propriété SynchronizingObject (je me souviens plus le nom exact) ; si tu le lui donnes, elle va lancer ses events sur le thread de ce Control.

  6. #6
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    oui ça revient à ce que j'ai écrit là haut. Mais autant utiliser ce qui est déjà écrit. Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/03/2015, 09h56
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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