Actualización de múltiples objetos INofityPropertyChange seleccionados en DataGridView
-
03-07-2019 - |
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)?
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.