2009-06-08 46 views
8

Estoy usando el control DataGridView para leer y escribir un archivo XML a través de la serialización XML.DataGridView -Value no se guarda si no se pierde la selección de una celda

Tengo un problema como se explica a continuación:

  1. leí un archivo XML y poblar controles DataGridView con el objeto deserializado.
  2. Actualizo todos los valores en DataGridView en la celda.
  3. Escojo la opción Guardar como archivo sin perder el foco en la última celda.

Después de esto, el valor de la celda en particular no se actualiza. Si intencionalmente cambio el enfoque (digamos que hago clic en otra celda en la misma cuadrícula) el valor se actualiza.

¿Alguien puede sugerir alguna solución para esto?

Respuesta

4

Si lo entiendo correctamente, una celda está en modo de edición y está tratando de detener la edición de manera programática y pasar el valor a la fuente de datos subyacente?

estoy usando un enfoque algo "sucio" para hacer que en una de mis aplicaciones:

if (dataGridView1.CurrentCell.IsInEditMode)  
{  
    int y = dataGridView1.CurrentCellAddress.Y;  
    int x = dataGridView1.CurrentCellAddress.X;  
    if (y > 0)  
     dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];  
    else  
     dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];  
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];  
} 

Ese pedazo de código primero comprueba si la celda actual está en modo de edición. Luego cambia la celda actual mediante programación (ya sea a la fila anterior o a la siguiente en caso de que estemos en la primera fila). Después de eso, restaura la selección de celda actual.

Llamarás a este código en tu controlador "Guardar archivo como".

+0

Gracias por la solución. –

+0

Me alegro de poder ayudar. ¿Podría marcar esto como su solución aceptada? –

15

Se debe a que el valor de la celda editada no está comprometido con DataSource hasta que se valida, lo que sucede cuando la celda pierde el foco. Si desea confirmar las modificaciones inmediatamente, puede controlar el evento CurrentCellDirtyStateChanged, y llame al método CommitEdit en el controlador:

void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
    EventArgs e) 
{ 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 
+1

Esto funcionó asombrosamente, gracias! –

+2

Esto funciona perfectamente en mi método de guardar. ¡¡Gracias!! –

+0

Esto también me ha funcionado muy bien. Gracias – Abdullah

0

Usted puede obtener el valor de una celda que aún no se ha comprometido mediante la propiedad EditedFormattedValue de la celda actual, como a continuación

dataGridView1.CurrentCell.EditedFormattedValue 
16

la mejor manera (aunque rápido y sucio) es asignar el valor a currentCell Nothing.

Por ejemplo, en el método de guardar, hacer:

dgvMyGrid.CurrentCell = Nothing 

y luego seguir adelante.

+0

Tengo la misma situación y su solución funcionó a la perfección. Todavía me pregunto cómo es posible esto. – JPReddy

0

Tuve la misma situación e incluso estaba usando las teclas del acelerador para guardar el botón para guardar los valores de la cuadrícula. Cuando hago clic en el botón Guardar, pierdo el foco de DGV y, por lo tanto, el valor de la celda se confirma, pero cuando uso las teclas del acelerador, el foco no se pierde de DGV, por lo tanto, no se compromete el valor de la celda.

Después de mirar la respuesta de Amit Karmakar, intenté con esa respuesta y funcionó. Para conocer más detalles, me puse a depurar el DGV y descubrí que realmente es lo mismo que commitedit, que de alguna manera no funciona si lo usas en el botón Guardar.

Cuando establecemos CurrentCell of DGV en nulo, antes de establecerlo en nulo DGV obtiene primero el valor editado y lo introduce en el valor de celda y luego establece CurrentCell REFERENCE en nulo. Aquí no significa que está estableciendo la celda DGV subyacente como nula. Por lo tanto, esto funciona perfectamente para el problema anterior.

Nota: Esta solución puede no funcionar perfectamente cuando tiene eventos de validación para la celda y si el usuario ingresa datos no válidos que no validarán. En este caso, la configuración de la celda actual como nulo también falla, ya que no puede enviar el valor a la celda.

Di esta explicación ya que he planteado la pregunta sobre la respuesta de Amit Karmakar preguntando cómo puede ser posible. Pensé que podría ayudar a otros, así que dejé esta explicación como respuesta.

0

OK, esto es feo, pero funciona para conseguir los cambios finales de la red sin tener que desplazarse a otra fila:

With DataGridView1 
    .DataSource = Nothing 
    .DataSource = gridDataTable 
    Dim changedFoo As DataTable = gridDataTable.GetChanges 
End With 

Sin embargo todavía me gusta la respuesta de Amit Karmakar la mejor. Agregué el 'DataGridView1.CurrentCell = Nothing' al evento DataGridView1 LostFocus.

Cuestiones relacionadas