Frage

Ich arbeite mit einem DataGridView (Windows Forms) mit Multiselect aktiviert, die in einem User Control platziert wird. Ich möchte alle ausgewählten Zeilen von außerhalb der User Control aktualisieren, indem Sie eine öffentliche Methode aufrufen, die den folgenden Code implementiert:

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

Leider, wenn mehrere Zeilen ausgewählt werden, wird nur ein DataGridViewRow wird sofort aktualisiert, nämlich die, die zuletzt ausgewählt wurde. Die zugrunde liegenden Objekte werden geändert, und das NotifyPropertyChange-Ereignis ausgelöst wird. Außerdem, wenn ich die Auswahl nach dem Update ändern, sehe ich alle Zeilen aktualisierten genau so, wie ich sie sofort sein möchte.

Die zweite Sache, sehr seltsam: Wenn ich einen Haltepunkt in dem Setter der Rating-Eigenschaft festgelegt, wo NotifyPropertyChange abgefeuert wird und wartet dort ein paar Sekunden, bevor die Codeausführung fortgesetzt, alles funktioniert gut (alle Zeilen werden sofort aktualisiert). Wenn ich F5 nicht sehr warte aber schnell drücken, jedesmal, wenn der Haltepunkt übergeben wird, erhalte ich die oben beschriebene Wirkung.

Ihr Business-Objekt sieht wie folgt aus (deutlich natürlich verkürzt):

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
}

Hat jemand schon dieses Verhalten auch bemerkt haben, oder sogar weiß, eine Lösung (oder eine Abhilfe)?

War es hilfreich?

Lösung

Wenn Ihr DGV in eine reguläre Liste gebunden ist, es abonniert nur auf die Property Ereignis für die aktuell ausgewählte Zeile. Versuchen Sie es mit einer Binding stattdessen oder rufen BindingSource.ResetItem (n) für jedes Element geändert.

MSDN gibt ein Beispiel die ein Binding verwendet und auch ( pointlessly) ruft ResetItem. Spielen Sie mit ihrem Beispiel, und man kann sehen, dass entweder den Anruf zu ResetItem Entfernen oder Ersetzen des Binding mit einer regualr List <> arbeiten wie vorgesehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top