visual textbox1 studio c# .net datagridview keydown

c# - textbox1 - textbox keydown



¿Cómo puedo capturar la pulsación de tecla que desencadena "CellEndEdit" en un DataGridView en C#? (3)

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?

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

Edit2: He intentado con la sugerencia de KeyPreview, pero el formulario todavía 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 DataGridView que ahora está configurada 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 "EditedFormattedValue" en una celda, aquí sería donde quiero poner mi valor de pulsación de teclas, 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?


Establezca la propiedad KeyPrevew en su formulario en true; eso evitará que el control se lo trague primero. :)


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 DataGridView y reemplazar 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 (necesitará subclasificarlo).

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 ingresar al modo de edición con F2, modificar una celda para decir "Hola" y cancelar la edición con Escape.

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

Espero que esto te dé lo que necesitas.


Mi problema fue similar, esta es mi solución:

Problem: cuando el usuario comenzó a editar un valor de celda en DGV y presionó la tecla ESC antes de confirmar el valor de EndEdit, que reescribió todos los campos de DGV para actualizar los campos de fecha y hora de actualización, solo quería ejecutar DGV.EndEdit cuando el usuario realmente cambió el valor y no presionó ESC mientras lo hacía.

Solution: en Cell Validation utilicé una bandera como esta para verificar si el valor se cambia y si el valor de la bandera es falso, simplemente haz una declaración if(!flag)return; en EndEdit