c# .net winforms validation datagridview

c# - Cómo ejecutar Run CellEndEdit solo cuando Cell ValueChanged en DataGridView



.net winforms (5)

quiero ejecutar CellEndEdit solo cuando se cambia el valor de la celda, intenté poner

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

en el evento CellValidation, el evento Cell Validation regresa, pero CellEndEdit también se ejecuta y actualiza, updated date y by campos cuando el usuario solo ha entrado en el modo de edición y salió sin cambiar la celda de valor.
Para cuando se alcanza CellValue y Formatted Value son los mismos, por lo que no pueden 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?


Definitivamente puede llegar allí al capturar el valor de la celda actual en CellBeginEdit y luego compararlo con el valor actual de la celda en CellEndEdit . (O use su truco de CellValidation ).

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


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).


Lo hice así:

DO#:

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

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


Pero si desea calcular el valor editado, puede usar el problema 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


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