1

Je travaille avec un DataGridView (Windows Forms) avec MultiSelect activé qui est placé dans un contrôle utilisateur. Je voudrais mettre à jour toutes les lignes sélectionnées à partir de l'extérieur du contrôle de l'utilisateur en appelant une méthode publique qui met en œuvre le code suivant:Mise à jour de plusieurs objets INofityPropertyChange sélectionnés dans DataGridView

foreach(DataGridViewRow dr in dataGridView.SelectedRows) 
{ 
    MyBusiness business = (MyBusiness)dr.DataBoundItem; 
    business.Rating = 5; 
} 

Malheureusement, lorsque plusieurs lignes sont sélectionnées, une seule DataGridViewRow est immédiatement rafraîchi, à savoir celle Ce dernier a été sélectionné. Les objets sous-jacents sont modifiés et l'événement NotifyPropertyChange est déclenché. De plus, quand je change la sélection après la mise à jour, je vois toutes les lignes mises à jour exactement comme je voudrais qu'elles soient immédiatement. Deuxième chose, très étrange: Lorsque je définis un point d'arrêt dans le Setter de la propriété Rating où NotifyPropertyChange est déclenché et attendez quelques secondes avant de poursuivre l'exécution du code, tout fonctionne bien (toutes les lignes sont immédiatement mises à jour). Si je n'attends pas mais appuie sur F5 très rapidement chaque fois que le point d'arrêt est passé, j'obtiens l'effet décrit ci-dessus.

Mon objet métier ressemble à ceci (considérablement raccourci bien sûr):

public class MyBusiness : INotifyPropertyChanged 
{ 
    private int _rating; 
    public int Rating 
    { 
     get { return _rating; } 
     set 
     { 
      if(_rating != value) 
      { 
       _rating = value; 
       NotifyPropertyChanged("Rating"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 

Quelqu'un at-il déjà remarqué ce comportement aussi, ou connaît même une solution (ou une solution de contournement)?

Répondre

2

Si votre DGV est liée à une liste régulière, elle ne s'abonne qu'à l'événement PropertyChanged pour la ligne actuellement sélectionnée. Essayez plutôt d'utiliser BindingList ou d'appeler BindingSource.ResetItem (n) pour chaque élément modifié.

MSDN gives an example qui utilise une BindingList et appelle (inutilement) ResetItem. Jouez avec leur exemple, et vous pouvez voir que soit supprimer l'appel à ResetItem, ou remplacer le BindingList par un regualr List <> fonctionnera comme prévu.

Questions connexes