2009-04-21 28 views
5

Tengo un DataGridView que está configurado en EditOnF2. Realizo un procesamiento especial de datos en el controlador de eventos CellEndEdit que establece el valor de la celda. Todavía quiero la funcionalidad de EditOnKeystrokeOrF2 de volver al valor original cuando se presiona la tecla Esc. Desafortunadamente, en el controlador de eventos CellEndEdit, no veo una forma de decir qué causó que se desencadenara el evento CellEndEdit. Solo quiero cambiar el valor de la celda si no se presiona la tecla Esc. ¿Cómo puedo saber si fue o no?¿Cómo puedo capturar la pulsación de tecla que desencadena "CellEndEdit" en un DataGridView en C#?

Editar: Vale la pena señalar que el evento KeyDown no se dispara cuando la celda se está editando, ni para la última pulsación de tecla de finalización.

Edit2: He intentado con la sugerencia de KeyPreview, pero el formulario aún no captura la tecla Escape que se está presionando.

Edit3: He estado experimentando tratando de hacer que esto funcione. Originalmente publiqué algunos de los siguientes como publicaciones por separado, pero creo que podría ser más relevante incluirlos aquí.

Tengo una celda en un DataGridView que ahora está configurado como EditProgrammatically. Para capturar la pulsación de tecla que inicia una edición, estoy configurando la celda.Valor igual a la pulsación de tecla. Sin embargo, esto arruina la funcionalidad "Escape" de la celda: cuando presiona "escape", en lugar de volver al valor original, vuelve a la combinación de teclas que programáticamente inserté en la celda.

Creo que si pudiera establecer el "EditedFormattedValue" en una celda, aquí sería donde quiero poner mi valor de pulsación de tecla, sin embargo, esto parece ser de solo lectura. ¿Cómo puedo lograr lo que estoy intentando?

Un ejemplo para aclarar: si la celda tiene un valor de "54.3" en ella, y presiono la tecla "9", comienza a editar la celda y coloca un "9" allí. Si presiono Escape, en lugar de volver a "54.3", vuelve a "9". Lo que quiero es que vuelva a su valor original de "54.3".

Por lo tanto, estoy tratando de abordar este problema tanto desde el principio como desde el final. Creo que el verdadero problema es que estoy sobrescribiendo el valor original y no tengo forma de determinar si debo revertirlo o no.

Edit4: Parece que valdría la pena utilizar CellValidating, pero estoy experimentando un comportamiento extraño cuando experimento con él. En un nuevo proyecto, creo DataGridView y me registro para los diversos eventos y veo que CellValidating se activa antes de CellEndEdit. Sin embargo, en mi proyecto en el que trato de hacer que esto funcione, CellEndEdit se activa ANTES de CellValidating. ¿Alguna idea sobre cuál podría ser la diferencia?

Respuesta

2

Establezca el KeyPrevew property en su formulario como verdadero; eso evitará que el control se lo trague primero. :)

+0

Gracias, pero después de probar esto, parece que la tecla de escape es todavía solo está siendo reconocido por la célula como el final de la edición y no como un evento KeyDown o KeyPress real en el formulario. –

0

Primero, tienes toda la razón, KeyPreview no funcionará. Al principio, pensé que podría evitar esto anulando el método IsInputKey del formulario. Esta técnica me ha funcionado en otros casos en los que no pude capturar una llave que necesitaba atrapar. Eso tampoco funcionó, así que intenté subclasificar el DataGridView y anular IsInputKey allí. Eso tampoco funcionó. Después de investigar los otros métodos que pude anular, descubrí que había otra clase de teclas llamadas teclas de comando que necesitaba interceptar. Para hacer eso, anule ProcessCmdKey en su DataGridView (deberá crear una subclase).

Aquí está mi código:

public class CommandKeyInterceptingDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     Debug.WriteLine(keyData); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

Y la salida de entrar en el modo de edición con F2, la modificación de una célula que decir "Hola" y la cancelación de la edición con Escape.

F2 
ShiftKey, Shift 
H, Shift 
E 
L 
L 
O 
Escape 

Espero que esto le proporcione lo que necesita.

0

Mi problema fue similar, aquí está mi solución:

Problem: Cuando el usuario inicia la edición de un valor de la celda en la DG V y pulsa la tecla ESC antes de comprometerse valor EndEdit estaba siendo llamado, que re-escribió todos los campos DGV a la base de datos actualizando así los campos de fecha de actualización &, solo quería que DGV.EndEdit se ejecutara cuando el usuario realmente cambiara el valor y no presionó ESC mientras lo hacía.

Solution: En validación de celda i utilizó una bandera como this para comprobar si se cambia el valor y si el valor de la bandera es falsa la acaba de hacer una if(!flag)return; en EndEdit

Cuestiones relacionadas