2011-10-10 20 views
5

Ho datagridview con DataSource impostato su myBindingList. Gli elementi della lista implementano INotifyPropertyChanged in modo che datagridview risponda automaticamente alle modifiche nell'elenco.DataGridView & BindingList: come verificare se il valore della cella è cambiato?

Ora devo calcolare alcuni riepiloghi delle colonne di datagridview.

Dovrebbe essere fatto quando:

  • modifiche origine dati (OnDataSourceChanged)
  • variazioni di valore delle cellule (OnCellValueChanged)

primo è chiaro, ma ho un piccolo problema con il secondo.

OnCellValueChanged fuochi quando l'utente cambia il valore della cella di controllo o su:

myDataGridView.Rows[x].Cells[y].Value=newValue; 

ma per quanto riguarda:

myBindingList[myInvoice].Property1=newValue; 

DataGridView aggiorna automaticamente (INotifyPropertyChanged), ma non si attiva evento OnCellValueChanged .

Qualche idea su come posso ottenere tali informazioni dal mio DataGridView? Deve essere fatto su livello DataGridView perché sto scrivendo il mio controllo che estende dgv.

Grazie per l'aiuto.

risposta

0

Il più vicino possibile a risolvere questo è utilizzare BindingSource come origine dati e quindi all'interno del proprio DataGridView personalizzato aumentare il proprio evento in risposta all'evento BindingSource ListChanged.

probabilmente sarei sovrascrivo qualcosa OnDataSourceChanged come questo:

public event EventHandler CustomCellValueChanged; 

protected override void OnDataSourceChanged(EventArgs e) 
{ 
    bs = this.DataSource as BindingSource; 

    if (bs == null) 
    { 
     throw new ArgumentException("DataSource must be a BindingSource"); 
    } 

    bs.ListChanged += new System.ComponentModel.ListChangedEventHandler(bs_ListChanged); 

    base.OnDataSourceChanged(e); 
} 

void bs_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) 
{    
    if (CustomCellValueChanged != null) 
    {    
     CustomCellValueChanged(this, new EventArgs()); 
    } 
} 

Il problema di questo è che non c'è modo (mi viene in mente) per ottenere le proprietà delle cellule corrette in modo che avrebbe dovuto rivalutare tutto le colonne, non solo la colonna che conteneva il cambiamento.

Problemi correlati