2010-07-27 11 views
16

Tengo un DataGridView vinculado a una BindingList (C# Windows Forms). Si cambio uno de los valores en un elemento de la lista, no aparece inmediatamente en la cuadrícula. Si hago clic en la celda modificada, o minimizo y luego maximizo la ventana, se actualiza correctamente, pero necesito que suceda automáticamente.DataGridView vinculado a BindingList no se actualiza cuando el valor ha cambiado

Tuve el mismo problema anteriormente, 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 actualizara correctamente.

La única manera que puedo conseguir que funcione es ...

dataGridView.DataSource = null; 
dataGridView.DataSource = myBindingList 

... pero me gusta mucho para evitar esto, ya que hace que la barra de desplazamiento pop de nuevo a la parte superior, y significa que Tendría que configurar los colores de fondo de mi celda nuevamente. Sin duda hay una mejor manera. Intenté Actualizar (así como actualizar el elemento principal), Actualizar e Invalidar, pero no están haciendo lo que necesito.

He visto este problema mencionado en algunos tableros de mensajes, pero aún no he visto una respuesta funcional.

Respuesta

20

ListChanged notificaciones de cambios en el valor del artículo solamente se plantean si el tipo de lista de elementos implementa la interfaz INotifyPropertyChanged.

Tomado de: http://msdn.microsoft.com/en-us/library/ms132742.aspx

Así que mi primera pregunta sería: Implementa su artículo del INotifyPropertyChanged correctamente?

+0

Sí! Esto resolvió el problema perfectamente. ¡Muchas gracias! –

+0

Gracias por esto, muy apreciado –

1

Parece que la notificación de Cambiar objeto no se desencadena/maneja correctamente. Personalmente siempre uso el objeto BindingSource cuando se vincula a un dataGridView.

Revisaría el DataGridView FAQ y el DataBinding FAQ y buscaría la notificación de cambio de objeto.

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

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

Luego, simplemente solicite el método refreshDataGrid cada vez que ocurra un cambio en su lista.

3

Sólo tiene que llamar myBindingList.ResetBindings() siempre que cambia sus datos!

+0

Sí ... no funciona. –

4

Su fuente de datos debe implementar INotifyPropertyChanged para que cualquier cambio en BindingList se refleje en la vista de cuadro 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; 
+0

Esto fue perfecto. Muchas gracias.MSDN debe contratar StackOverflow para hacer sus ejemplos de código; Los de Microsoft dejan mucho que desear ("Aquí hay una línea de código que realmente no te ayuda ...") – curob

+0

Genius. Ahorrando tanto tiempo y código. No he sabido que 'PropertyChanged' funcionaría en winforms. ¡Muchas gracias! – C4u

Cuestiones relacionadas