2010-07-27 12 views
16

Ho un DataGridView associato a un BindingList (C# Windows Forms). Se cambio uno dei valori in una voce nella lista non viene immediatamente visualizzato nella griglia. Se clicco sulla cella modificata, o riduci a icona, allora massimizzo la finestra che aggiorna correttamente, ma ho bisogno che accada automaticamente.DataGridView associato a BindingList non si aggiorna quando il valore viene modificato

Ho avuto lo stesso problema in precedenza, ma in quella situazione ho dovuto cambiare il colore di sfondo della cella nello stesso momento in cui il valore è cambiato. Ciò ha causato il corretto aggiornamento della cella.

L'unico modo in cui posso farlo funzionare è ...

dataGridView.DataSource = null; 
dataGridView.DataSource = myBindingList 

... ma mi piacerebbe davvero evitare questo in quanto rende la barra di scorrimento pop torna, e significa che Dovrei impostare nuovamente i colori di sfondo delle celle. Sicuramente c'è un modo migliore. Ho provato Refresh (oltre ad aggiornare il genitore), Update e Invalidate, ma non stanno facendo ciò di cui ho bisogno.

Ho visto questo problema menzionato su alcune bacheche, ma non ho ancora visto una risposta funzionante.

risposta

20

ListChanged notifiche per le modifiche dei valori oggetto vengono generati solo se il tipo di elemento lista implementa l'interfaccia INotifyPropertyChanged.

Tratto da: http://msdn.microsoft.com/en-us/library/ms132742.aspx

Quindi la mia prima domanda sarebbe: Implementa il vostro articolo il INotifyPropertyChanged correttamente?

+0

Sì! Questo ha risolto il problema perfettamente. Grazie mille! –

+0

Grazie per questo, molto apprezzato –

1

Sembra che la notifica dell'oggetto di modifica non venga attivata/gestita correttamente. Personalmente utilizzo sempre l'oggetto BindingSource durante il binding a un oggetto DataGridView.

Vorrei controllare lo DataGridView FAQ e lo DataBinding FAQ e cercare la notifica di modifica dell'oggetto.

Se si utilizza ADO.Net, non dimenticare di chiamare i metodi .Validate() e .EndEdit().

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

Quindi, chiamare il metodo refreshDataGrid ogni volta che si verifica un cambiamento nell'elenco.

3

Basta chiamare myBindingList.ResetBindings() ogni volta che le modifiche dei dati!

+0

Sì ... non funziona. –

4

L'origine dati deve implementare INotifyPropertyChanged affinché qualsiasi modifica in BindingList venga riflessa nella vista datagrid.

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

Questo è stato perfetto. Grazie mille.MSDN dovrebbe contrattare con StackOverflow per fare i loro esempi di codice; Microsoft lascia molto a desiderare ("Ecco una riga di codice che non ti aiuta davvero ...") – curob

+0

Genius. Risparmiando così tanto tempo e codice. Non ho saputo che 'PropertyChanged' avrebbe funzionato in winforms. Grazie mille! – C4u

Problemi correlati