Pregunta

Estoy trabajando con un DataGridView (Windows Forms) con MultiSelect habilitado que se coloca en un Control de usuario. Me gustaría actualizar todas las filas seleccionadas desde fuera del Control de usuario llamando a un método público que implemente el siguiente código:

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

Desafortunadamente, cuando se seleccionan varias filas, solo una DataGridViewRow se actualiza inmediatamente, es decir, la última que se seleccionó. Los objetos subyacentes se cambian y se activa el evento NotifyPropertyChange. Además, cuando cambio la selección después de la actualización, veo todas las filas actualizadas exactamente como me gustaría que fueran de inmediato.

Segunda cosa, muy extraña: cuando establezco un punto de interrupción en el Setter de la propiedad Rating - donde se activa NotifyPropertyChange y espero allí unos segundos antes de continuar la ejecución del código, todo funciona bien (todas las filas se actualizan inmediatamente). Si no espero pero presiono F5 muy rápidamente cada vez que se pasa el punto de interrupción, obtengo el efecto descrito anteriormente.

Mi objeto de negocio se ve así (acortado significativamente, por supuesto):

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
}

¿Alguien ya ha notado este comportamiento también, o incluso conoce una solución (o una solución alternativa)?

¿Fue útil?

Solución

Si su DGV está vinculado a una Lista normal, solo se suscribe al evento PropertyChanged para la fila seleccionada actualmente. Intente usar una BindingList en su lugar, o llame a BindingSource.ResetItem (n) para cada elemento modificado.

MSDN da un ejemplo que utiliza una BindingList y también ( inútilmente) llama a ResetItem. Juegue con su ejemplo, y puede ver que ya sea eliminando la llamada a ResetItem o reemplazando BindingList con una lista regualr & Lt; & Gt; funcionará según lo previsto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top