2011-10-10 21 views
5

Tengo datagridview con DataSource establecido en myBindingList. Los elementos de la lista implementan INotifyPropertyChanged para que datagridview responda automáticamente a los cambios en la lista.DataGridView & BindingList: ¿Cómo verificar si el valor de la celda ha cambiado?

Ahora tengo que calcular algunos resúmenes de columnas de datagridview.

Debe hacerse cuando:

  • cambios de origen de datos (OnDataSourceChanged)
  • cambios en el valor de la célula (OnCellValueChanged)

El primero es clara, pero tengo un pequeño problema con el segundo.

OnCellValueChanged se activa cuando el usuario cambia el valor de la celda de control o en:

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

pero ¿qué pasa:

myBindingList[myInvoice].Property1=newValue; 

DataGridView se actualiza automáticamente (INotifyPropertyChanged) pero no se dispara evento OnCellValueChanged .

¿Alguna idea de cómo puedo obtener dicha información de mi DataGridView? Tiene que hacerse a nivel de DataGridView porque estoy escribiendo mi propio control que extiende dgv.

Gracias por la ayuda.

Respuesta

0

Lo más cercano que puedo pensar para resolver esto es utilizar un BindingSource como fuente de datos y luego dentro de su DataGridView personalizado plantear su propio evento en respuesta al evento BindingSource ListChanged.

probablemente me anulan algo OnDataSourceChanged así:

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()); 
    } 
} 

El problema con esto es que no hay manera (no se me ocurre) para obtener las propiedades de celda correctas por lo que tendría que reevaluar todo las columnas, no solo la columna que contenía el cambio.

Cuestiones relacionadas