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. myGrid
muestra dos filas, pero cuando agrego nuevos elementos a mi persons
lista, myGrid
no 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 DataTable
a la cuadrícula, cuando cada vez que hago algunos cambios, DataTable
no hay necesidad de volver a enlazar myGrid
.
¿Cómo solucionarlo sin volver a enlazar cada vez?
One
La forma es utilizar BindingList, que generará un evento si cambia la lista subyacente. Otra forma es usarBindingSource
ay 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 implementarlosINotifyPropertyChanged
List<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, peroBindingSource
tiene 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 databindings
BindingSource
como 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.DataSource
su 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.AddingNew
evento y cree el objeto usted mismo. Nunca experimenté una desventaja mientras lo usaba,BindingSource
pero 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
INotifyPropertyChanged
DataGridView 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 unaIBindingList
interfaz 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
persons
agregar:fuente
null
si lo asigna inmediatamentepersons
en 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