c# winforms data-binding datagridview

c# - DataGridView enlazado a BindingList no se actualiza cuando cambia el valor



winforms data-binding (5)

Tengo un DataGridView enlazado a un BindingList (C # Windows Forms). Si cambio uno de los valores en un elemento de la lista, no aparecerá inmediatamente en la cuadrícula. Si hago clic en la celda modificada, o la minimizo, maximizo la ventana que se actualiza correctamente, pero necesito que suceda automáticamente.

Anteriormente tuve el mismo problema, pero en esa situación tuve que cambiar el color de fondo de la celda al mismo tiempo que cambiaba el valor. Esto causó que la celda se actualice correctamente.

La única forma en que puedo hacerlo funcionar es ...

dataGridView.DataSource = null; dataGridView.DataSource = myBindingList

... pero realmente me gustaría evitar esto, ya que hace que la barra de desplazamiento vuelva a aparecer en la parte superior, y significa que debo configurar los colores de fondo de mi celda nuevamente. Seguramente hay una mejor manera. He intentado Actualizar (así como actualizar el padre), Actualizar e Invalidar, pero no están haciendo lo que necesito.

He visto este problema mencionado en algunos paneles de mensajes, pero todavía no he visto una respuesta práctica.



Simplemente llame a myBindingList.ResetBindings() siempre que sus datos cambien.


Su INotifyPropertyChanged datos debe implementar INotifyPropertyChanged para que cualquier cambio en BindingList se refleje en la vista de datos.

class Books : INotifyPropertyChanged { private int m_id; private string m_author; private string m_title; public int ID { get { return m_id; } set { m_id = value; NotifyPropertyChanged("ID"); } } public string Author { get { return m_author; } set { m_author = value; NotifyPropertyChanged("Author"); } } public string Title { get { return m_title; } set { m_title = value; NotifyPropertyChanged("Title"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string p) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(p)); } } BindingList<Books> books= new BindingList<Books>(); datagridView.DataSource = books;


Suena cuando la notificación de cambio de objeto no se activa / maneja correctamente. Personalmente, siempre uso el objeto BindingSource al enlazar con un dataGridView.

Me gustaría consultar las preguntas frecuentes de DataGridView y las preguntas frecuentes de DataBinding y buscar una notificación de cambio de objeto.

Si está utilizando ADO.Net, no olvide llamar a los métodos .Validate () y .EndEdit ().


private void refreshDataGrid() { dataGridView1.DataSource = typeof(List<>); dataGridView1.DataSource = myBindingList; dataGridView1.AutoResizeColumns(); dataGridView1.Refresh(); }

Luego, solo llame al método refreshDataGrid cada vez que ocurra un cambio en su lista.