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 Presentation Foundation Discussion :

Rafraichir un Datagrid (WPFToolkit)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut Rafraichir un Datagrid (WPFToolkit)
    Bonjour,

    Avant tout, ne criez pas. Lisez jusqu'au bout.

    J'ai un datagrid qui a pour ItemSource un List<MonTypeAMoi>
    (pas de ObservableCollection parce que je n'ai pas besoin d'ajouter / supprimer des éléments, et c'est juste pour visualiser)
    Les données s'affichent bien à l'initialisation mais après, si l'objet source est modifié, je n'arrive pas à le rafraîchir sauf en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    datagrid1.itemsource = null;
    datagrid1.itemsource= MaListe;
    Ce qui fout en l'air le tri, l'ordre des colonnes si l'utilisateur l'a changé et quelques améliorations spécifiques.


    c'est effectivement un sujet qui a déjà été abordé ici : mais si j'adopte la solution donnée, GetBindingExpression renvoie null parce que _txtInfo1 n'a pas de liaison active.
    J'ai ajouté un binding (voir projet exemple ci-joint) mais le updateTarget ne fait rien.

    Je suis tombé sur ce lien qui dit que c'est une régression connue (mais ça vient d'un forum, la fiabilité de la source n'est pas forcée). Est-ce que l'un de vous aurait eu cet écho ?

    J'ai tenté d'implémenter le INotifyPropertyChanged mais toujours sans résultat (le binding fait bien afficher la collection dans la grille s'il n'y a rien mais ne rafraîchit pas s'il y a déjà quelque chose). Cependant, ça peut venir de moi.

    Est-ce que quelqu'un a déjà réussi à rafraîchir la datagrid du WPFToolkit ?


    Côté code, voilà la datagrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <my:DataGrid AutoGenerateColumns="True" Name="dataGrid1" />
    J'ai mis AutoGenerateColumn à true parce qu'il ne connaît pas la propriété DataFieldBinding (et puis ça suffit pour l'exemple).

    Le code-Behind :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
      public partial class Window1 : Window
      {
        List<Book> LsBooks;
     
        public Window1()
        {
          InitializeComponent();
        }
     
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
          // initialisation collection qui sert de source au datagrid
          LsBooks = new List<Book>();
          LsBooks.Add(new Book(30, "j'ai les cheveux longs", "napoleon"));
          LsBooks.Add(new Book(30, "le bon gigot d'antan", "maite"));
          LsBooks.Add(new Book(30, "oui oui et sa voiture jaune", "non non"));
     
          dataGrid1.ItemsSource = LsBooks;
        }
     
        /* note sur le refraichissement par binding, si on enlève le "dataGrid1.ItemsSource = LsBooks;" de l'evenement loaded et que l'on execute le projet, puis clique sur le bouton "refresh normal", on voit bien que le binding se fait puisque la datagrid se remplit. 
         * mais s'il y a déjà quelquechose dans la grille, rien ne se passe
         */
        private void button2_Click(object sender, RoutedEventArgs e)
        {
     
          // modification de la source
          LsBooks[1].price += 1;
          LsBooks.Add(new Book(20, "Comment rater un tour hihihi", "Garcimore"));
     
          // mise en place du binding (serait mieux dans l'evenement loaded mais histoire de tout séparer, je le mets ici)
          Binding b = new Binding("");
          b.Mode = BindingMode.OneWay;
          b.Source = LsBooks;
          dataGrid1.SetBinding(ItemsControl.ItemsSourceProperty, b);
     
     
          // création d'un bindingexpression pour lancer le binding quand on veut 
          BindingExpression bindExpression = dataGrid1.GetBindingExpression(ItemsControl.ItemsSourceProperty);
     
          // on mets à jour
          bindExpression.UpdateTarget();
     
          // perdu , ça ne fait rien ... pourquoi ? 
        }
      }
     
     
      public class Book
      {
        public int price { get;  set; }
        public string title { get;  set; }
        public string author { get;  set; }
     
        public Book(int p, string t, string a)
        {
          price = p;
          title = t;
          author = a;
        }
      }
    Le code complet dans un mini-projet en pièce jointe.
    Fichiers attachés Fichiers attachés
    --
    Arnaud DANEELS

  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 : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par adaneels Voir le message
    J'ai un datagrid qui a pour ItemSource un List<MonTypeAMoi>
    (pas de ObservableCollection parce que je n'ai pas besoin d'ajouter / supprimer des éléments, et c'est juste pour visualiser)
    Pourtant dans ton code tu ajoutes bien un nouvel élément à ta liste. Cet ajout ne sera pas refléter vu que tu n'utilise pas de ObservableCollection.

    Et tu modifies le prix d'un Book. Cela ne sera pas non plus refléter car ta classe n'implémente pas INotifyPropertyChanged.
    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
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Pourtant dans ton code tu ajoutes bien un nouvel élément à ta liste. Cet ajout ne sera pas refléter vu que tu n'utilise pas de ObservableCollection.
    Oui, c'est juste pour l'exemple mais effectivement, ça ne sert à rien.

    Citation Envoyé par The_badger_man Voir le message
    Et tu modifies le prix d'un Book. Cela ne sera pas non plus refléter car ta classe n'implémente pas INotifyPropertyChanged.
    Excuse moi, j'ai relu mon code et j'ai oublié une ligne ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Binding b = new Binding("");
          b.Mode = BindingMode.OneWay;
          b.Source = LsBooks;
          b.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
          dataGrid1.SetBinding(ItemsControl.ItemsSourceProperty, b);
    Mais je viens de m'apercevoir que je faisais un UpdateTarget après et non un UpdateSource. donc pas possible avec le Explicit à priori.

    Je vois en implémentant le INotifyPropertyChanged et je reviens (mais ce ne sera pas pou rtotu de suite)
    --
    Arnaud DANEELS

  4. #4
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Et tu modifies le prix d'un Book. Cela ne sera pas non plus refléter car ta classe n'implémente pas INotifyPropertyChanged.
    Mais le UpdateTarget (lien MSDN) justement force la mise à jour de la grille.

    Cette méthode vous permet de forcer un transfert de données de la propriété source à la propriété cible. Si votre objet source implémente un mécanisme approprié de notification de modification de propriété tel que INotifyPropertyChanged, les mises à jour cibles se produisent automatiquement. Toutefois, vous avez l'option d'utiliser cette méthode pour mettre à jour explicitement la propriété cible dans les cas où votre objet source ne fournit pas de notifications de modification de propriété appropriées.
    --
    Arnaud DANEELS

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    pour info le observable collection ne difuse pas que les event type add, delete mais pas mal d'autres, donc c'est plus sympa de l'utiliser
    plus globalement il vaut mieux l'utiliser et utiliser le inotifypropertychanged en general avec un binding ca met tout a jour directement
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    d'ailleurs si tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            ObservableCollection<Book> LsBooks;
     
            public Window1()
            {
                InitializeComponent();
            }
     
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                // initialisation collection qui sert de source au datagrid
                LsBooks = new ObservableCollection<Book>();
    .....
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public class Book : INotifyPropertyChanged
        {
            private int _price = 0;
            public int price
            {
                get { return _price; }
                set
                {
                    _price = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("price"));
                }
            }
    en cliquant sur ton bouton 1 tout est mis a jour ....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut


    Citation Envoyé par ikeas Voir le message
    d'ailleurs si tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     public class Book : INotifyPropertyChanged
        {
            private int _price = 0;
            public int price
            {
                get { return _price; }
                set
                {
                    _price = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("price"));
                }
            }
    Tu n'as pas oublié ceci dans la classe Book ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        public event PropertyChangedEventHandler PropertyChanged;
    (sinon, la propriété PropertyChanged n'est pas implémentée d'après le compilateur)

    et c'est vrai , ça marche. Simple comme bonjour quand on connaît bien.

    Pour ceux qui reprendront la discussion plus tard, ne pas oublier de rajouter ces deux using :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    Ikeas : si tu n'habitais pas si loin, j't'inviterai bien à prendre une bière belge ou un whisky écossais dans une petite crique face à la mer pour tout ce dépannage. Quoi qu'il y a un peu trop de vent frais là.
    (rappel pour les enfants : pas bien de boire... mais agréable ... donc avec modération pour ne pas avoir le foie qui lâche en milieu/fin de vie !)
    --
    Arnaud DANEELS

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    D'une manière générale, pour que ton interface graphique soit notifiée que ta collection a été modifiée il faut que cette collection implémente l'interface INotifyCollectionChanged. 2 possibilités:
    - tu créés ta propre classe/collection et tu implémentes l'interface
    - tu utilises la classe ObservableCollection qui embarque déjà tout ce qu'il te faut

    C'est égalemet le cas avec les objets métiers qui doivent implémenter INotifyPropertyChanged.

  9. #9
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    D'une manière générale, pour que ton interface graphique soit notifiée que ta collection a été modifiée il faut que cette collection implémente l'interface INotifyCollectionChanged. 2 possibilités:
    - tu créés ta propre classe/collection et tu implémentes l'interface
    - tu utilises la classe ObservableCollection qui embarque déjà tout ce qu'il te faut

    C'est égalemet le cas avec les objets métiers qui doivent implémenter INotifyPropertyChanged.
    Merci pour l'info et pour avoir mis le tag [Résolu] , je revenais justement pour le mettre.
    --
    Arnaud DANEELS

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    non je l'avait pas oublier le PropertyChanged
    j'ai implementé l'interface mais je t'avais juste pas mis le code
    comme j'ai testé avec ton projet si je l'avais oublié il aurait "rallé" le compilo

    cela dit pour la bierre, la krik ou le wiski tu peux toujours me les envoyer ahahahahahahah

    par contre ce que je trouve bien chez toi c'est de fournir uin petit projet d'exemple si tt le monde faisait ça on pourrait aider plus simplement
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  11. #11
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par ikeas Voir le message
    par contre ce que je trouve bien chez toi c'est de fournir uin petit projet d'exemple si tt le monde faisait ça on pourrait aider plus simplement
    Je continuerai comme ça alors.
    Seul truc, c'est que ça peut amener des virus.
    --
    Arnaud DANEELS

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par adaneels
    Je continuerai comme ça alors.
    Seul truc, c'est que ça peut amener des virus.
    Dans la majorité des cas, un exemple n'est pas nécessaire. Ensuite, il est possible de mettre son code dans les balises CODE et il n'est alors pas dur à ceux qui veulent aider de reproduire le scénario.

    Néanmoins il arrive parfois, lors de scénarios compliqués à expliquer et fastidieux à mettre en place, de voir un intérêt à la pièce jointe.

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

Discussions similaires

  1. datagrid WPFToolkit - Perte de focus
    Par Aurélien19 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/10/2010, 12h17
  2. Rafraichir un Datagrid après MAJ de la BD
    Par b_zakaria dans le forum Flex
    Réponses: 9
    Dernier message: 25/03/2009, 15h44
  3. rafraichir des datagrids
    Par boubounne dans le forum VB.NET
    Réponses: 9
    Dernier message: 06/03/2007, 17h56
  4. [VB.NET] Comment rafraichir un DataGrid ?
    Par Hakki dans le forum Accès aux données
    Réponses: 7
    Dernier message: 11/11/2006, 17h38
  5. [C#] Rafraichir un datagrid.
    Par msalque dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/08/2005, 07h54

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