Tengo una clase
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
y una List<Person>a la que agrego algunos elementos. La lista está vinculada a mi DataGridView.
List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;
No hay ningún problema. myGridmuestra dos filas, pero cuando agrego nuevos elementos a mi personslista, myGridno muestra una nueva lista actualizada. Solo muestra las dos filas que agregué antes.
Entonces, ¿cuál es el problema?
Rebobinar cada vez funciona bien. Pero cuando enlazo a DataTablea la cuadrícula, cuando cada vez que hago algunos cambios, DataTableno hay necesidad de volver a enlazar myGrid.
¿Cómo solucionarlo sin volver a enlazar cada vez?

OneLa forma es utilizar BindingList, que generará un evento si cambia la lista subyacente. Otra forma es usarBindingSourceay llamar a ResetBinding () cada vez que agrega / elimina una Fila, pero eso es mucho más trabajo. Si desea informar a Grid sobre los cambios de propiedad, la forma más fácil es implementarlosINotifyPropertyChangedList<T>si lo desea. Pero si agrega elementos a la lista mediante programación, DataGridView no lo sabrá porque su lista no implementaIBindingList. Con respecto a BindingSource: uso mucho winforms, y no me enlace a nada más que a BindingSource - FULLSTOP. Agregar más detalles es demasiado para un comentario, peroBindingSourcetiene mucho que ofrecer sin desventajas. Iría tan lejos y diríaAnyone who does not use a BindingSource for binding has not fully understood windows forms databindingsBindingSourcecomo un puente entre su fuente de datos y su GUI. Resuelve muchos problemas relacionados con la vinculación de datos. ¿Quieres recargar tus datos? Simplemente configurebindingSource.DataSourcesu nueva colección en lugar de volver a vincular todos los controles. ¿Tu fuente de datos puede ser nula? EstablecerbindingSource.DataSource = typeof(YourClass)¿Quiere tener una cuadrícula editable pero su fuente de datos no tiene un constructor sin parámetros? Simplemente implemente elbindingSource.AddingNewevento y cree el objeto usted mismo. Nunca experimenté una desventaja mientras lo usaba,BindingSourcepero muchos beneficios.Cada vez que agrega un nuevo elemento a la Lista, debe volver a vincular su Grid. Algo como:
fuente
Sí, es posible hacerlo sin volver a enlazar implementando la interfaz INotifyPropertyChanged.
Un ejemplo bastante simple está disponible aquí,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
fuente
INotifyPropertyChangedDataGridView mostrará todos los cambios de propiedad que ocurren en segundo plano, pero no sabrá si agrega / elimina una fila de su fuente. Para ello existe unaIBindingListinterfaz y, para su conveniencia, una implementaciónBindingList<T>que ya la implementa, pero que no admite clasificación / filtrado.Después de agregar un nuevo elemento para
personsagregar:fuente
nullsi lo asigna inmediatamentepersonsen la siguiente línea?Este no es exactamente el problema que tuve, pero si alguien está buscando convertir una BindingList de cualquier tipo en una Lista del mismo tipo, entonces así es como se hace:
Además, si está asignando BindingLists de tipos dinámicos a un DataGridView.DataSource, asegúrese de declararlo primero como IBindingList para que funcione lo anterior.
fuente