Domanda

Sto lavorando con un DataGridView (Windows Form) con MultiSelect abilitato che viene inserito in un controllo utente. Vorrei aggiornare tutte le righe selezionate al di fuori del controllo utente chiamando un metodo pubblico che implementa il seguente codice:

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

Sfortunatamente, quando sono selezionate più righe, solo una DataGridViewRow viene immediatamente aggiornata, vale a dire quella che è stata selezionata l'ultima volta. Gli oggetti sottostanti vengono modificati e viene attivato l'evento NotifyPropertyChange. Inoltre, quando cambio la selezione dopo l'aggiornamento, vedo tutte le righe aggiornate esattamente come vorrei che fossero immediatamente.

Seconda cosa, molto strano: quando imposto un punto di interruzione nel Setter della proprietà Rating - dove viene attivato NotifyPropertyChange e aspetto lì alcuni secondi prima di continuare l'esecuzione del codice, tutto funziona bene (tutte le righe vengono immediatamente aggiornate). Se non aspetto, ma premo F5 molto rapidamente ogni volta che viene superato il punto di interruzione, ottengo l'effetto sopra descritto.

Il mio oggetto business si presenta così (ovviamente abbreviato in modo significativo):

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
}

Qualcuno ha già notato anche questo comportamento o conosce una soluzione (o una soluzione alternativa)?

È stato utile?

Soluzione

Se il tuo DGV è associato a un normale elenco, si iscrive solo all'evento PropertyChanged per la riga attualmente selezionata. Prova invece a utilizzare un BindingList o a chiamare BindingSource.ResetItem (n) per ciascun elemento modificato.

MSDN fornisce un esempio che utilizza un BindingList e anche ( inutilmente) chiama ResetItem. Gioca con il loro esempio e puoi vedere che rimuovendo la chiamata a ResetItem o sostituendo la BindingList con una Regualr List & Lt; & Gt; funzionerà come previsto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top