2012-01-17 44 views
5

Quiero correr CellEndEdit sólo cuando se cambia el valor de la celda, intentaron ponerCómo ejecutar Ejecutar CellEndEdit sólo cuando la célula ValueChanged en DataGridView

if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) 
      return; 

en caso CellValidation, el evento de validación de celda hace volver pero CellEndEdit también recibe ejecutado y actualizaciones, updated date & by campos cuando el usuario solo ha entrado en el modo de edición y salió sin cambiar la celda de valor.
En el momento en que se llega a CellEndEdit CellValue & Formatted Value son iguales, así que no pude poner esto en CellEndEdit.

Una solución trivial es establecer un indicador en CellValidation y devolver CellEndEdit cuando se establece el indicador, pero esto parece ser una solución propensa a errores, ya que hay alrededor de 10 girds en el formulario. Entonces 10 banderas?

Respuesta

13

En lugar de realizar sus tareas en CellEndEdit, colóquelas en CellValueChanged. Se dispara solo cuando se cambia el valor de la celda. Tenga en cuenta que se activará cuando sus DataGridViews se llenen inicialmente, pero para manejar eso, puede poner solo una variable que diga formInitialized o algo así, para asegurarse de que no esté ejecutando su CellEndEdit cuando complete sus cuadrículas de datos.

Y para responder a su pregunta, no hay forma de averiguar si el valor se cambia cuando se activa CellEndEdit, porque siempre se activa cuando la celda sale del modo de edición. La única solución es, como usted propuso, almacenar el valor antiguo externamente, pero ya se dio cuenta de por qué es tan malo (aunque funciona realmente bien en la mayoría de los casos).

+2

buena respuesta, para evitar tener que mantener una variable 'formInitialized ', podría conectar el evento' CellValueChanged 'después de' this.InitializeComponent(); ' llamar al constructor de formulario/control. De esa forma no tendrás que mantener la variable. –

0

Definitivamente puede obtenerlo capturando el valor actual de la celda en CellBeginEdit, y luego comparándolo con el valor actual de la celda en CellEndEdit. (O use su truco CellValidation)

Para evitar "múltiples indicadores", puede usar un Dictionary<DataGridView,object> para poder ingresar el diccionario con la cuadrícula del evento actual, y luego obtener o establecer el valor apropiado.

0
MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()); 
0

Pero si desea calcular el valor editado, puede utilizar el tema sugerido por J.Fisher como:

Private Sub dgvHost_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvHost.CellBeginEdit 
    dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value 
End Sub 

Private Sub dgvHost_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvHost.CellEndEdit 
    If dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value Then Exit Sub 
    dgvHost.CurrentCell.Tag = Nothing 
    'Do something like 
    dgvHost.CurrentCell.Value = MD5(dgvHost.CurrentCell.Value) 
End Sub 
0

lo hice así:

C#:

private void DynList_RowValidated(object sender, DataGridViewCellEventArgs e) 
{ 
    if (ChangedRow == true) { 
     ChangedRow = false; 
     //Row Changed... 
    } 

} 
bool ChangedRow; 
private void DynList_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    ChangedRow = true; 
} 

VB.Net:

Private Sub DynList_RowValidated(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) 
     If ChangedRow = True Then 
      ChangedRow = False 
      'Row Changed... 
     End If 

End Sub 
Dim ChangedRow As Boolean 
Private Sub DynList_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) 
     ChangedRow = True 
End Sub 

me trató como 1 hora para archieve esto, porque nadie tenía una solución para eso, así que pensé que podría ser útil para otros

Cuestiones relacionadas