2010-08-25 15 views
5

En una aplicación de WinForms que estoy escribiendo en C#, tengo un DataGridViewTextBoxColumn con celdas que contienen valores enteros que me gustaría que los usuarios capaz de incrementar o disminuir usando las teclas + y - de sus teclados.Usando + (más) y - (menos) teclas del teclado como incrementos y decrementadores en un DataGridView

He manejado el evento KeyDown ya que es lo que uso generalmente para manejar las teclas Eliminar, etc., pero no funciona para las teclas Más y Menos ya que presionarlas hace que la Célula entre en modo Edición, y el evento KeyDown nunca se activa para esas claves como resultado. Lo mismo para el evento KeyPress

En realidad, se dispara si configuro las celdas de solo lectura, pero no estoy contento con esta solución ya que me obligaría a establecer la propiedad de verdadera a falsa en varias áreas de mi código y podría volverse desordenado rápidamente

¿Cuál sería la mejor manera de lograrlo?

Gracias.

Respuesta

2

Debe interceptar la pulsación de tecla antes de que lleguen a la cuadrícula de datos.

Esto se parece sorprendentemente cerca de lo que estamos tratando de hacer: http://support.microsoft.com/kb/320584

+0

Muy bien, gracias. Está funcionando. En realidad, una solución más simple que la que se muestra en la KB es establecer la propiedad KeyPreview del formulario en true y luego manejar el evento KeyDown del formulario. Mientras funciona, tiene varios inconvenientes: una cierta lógica de DataGridView está en eventos relacionados con el formulario en lugar de estar en los eventos de DataGridView. Como la celda todavía entra en modo de edición incluso con esta solución, tuve que hacer un seguimiento de si las teclas fueron presionadas y en las columnas correctas en un indicador bool, y cancelar el evento CellBeginEdit si el indicador es verdadero para evitarlo para entrar en modo de edición. –

+0

Aparte del hecho de que no es tan elegante como hubiera querido, esto funciona bastante bien, así que muchas gracias. Voy a dejar esto abierto por un tiempo, solo en caso de que alguien más tenga otras sugerencias. –

2

Vaya, que el artículo de KB es bastante malo. Eso debe hacerse anulando IsInputKey().

No me importa mucho para DGV, es un insecto para personalizar. Sin embargo, es probable que pueda golpear a esto en algún tipo de forma:

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler Increment; 
    public event EventHandler Decrement; 

    protected override void OnKeyDown(KeyEventArgs e) { 
     bool used = false; 
     if (this.EditingControl == null) { 
      if (e.KeyData == Keys.Oemplus) { 
       if (Increment != null) { Increment(this, EventArgs.Empty); used = true; } 
      } 
      else if (e.KeyData == Keys.OemMinus) { 
       if (Decrement != null) { Decrement(this, EventArgs.Empty); used = true; } 
      } 
     } 
     if (used) e.SuppressKeyPress = e.Handled = true; 
     else base.OnKeyDown(e); 
    } 
} 
+0

Gracias, eso es elegante. Lo intenté y funciona si cancelo el evento CellBeginEdit. El problema es que el evento OnKeyDown de DataGridView se activa después del evento CellBeginEdit, por lo que no tengo forma de determinar qué tecla presionó el usuario para cancelar el evento o no. ¿Alguna idea? Además, dices que el DGV es un dolor de personalizar: al principio pensé que era muy minucioso, pero ¿estoy de acuerdo en que estoy corriendo rápidamente a sus limitaciones? ¿Alguna sugerencia de terceros? Todos los que probé parecen muy desollados/temáticos y me gustó el estilo de la DGV, ya que se combina bien con otros controles de WinForms. –

+0

Esto es * exactamente * lo que quise decir, es un dolor. Establezca e.SuppressKeyPress y e.Handled en verdadero si usa la combinación de teclas, olvidé incluir eso. Publicación actualizada –

+0

Gracias, probé su nuevo código pero el problema es que los controladores de eventos Incrementar y Disminuir no se activan si el usuario puede modificar la celda.Si los configuro como de solo lectura, los eventos ocurren, pero en mi caso, deben ser modificables. Parece que la celda que va al modo de edición se produce antes del método OnKeyDown y evita que se ejecute. En mi caso, las celdas deberían ser modificadas por los usuarios. El método utilizado en mi comentario debajo del trabajo de respuesta de Dave, porque los eventos de formulario se disparan antes que cualquiera de los DGV, pero no es realmente elegante como dije. ¿Alguna forma de hacer que el tuyo funcione? –

7

¿Has probado con esto:

lugar de usar este: Keys.OemMinus uso esto: Keys.Subtract

y en su lugar de usar esto: Keys.Oemplus utiliza esto: Keys.Add

+0

Tenga en cuenta que es posible que necesite comprobar ambos conjuntos, en mi teclado Logitech K120 'Keys.Oemplus' y' Keys.OemMinus' son para las teclas [+] y [-] en la fila numérica, y 'Keys.Add' y 'Keys.Subtract' son para la tecla [+] y [-] en el teclado numérico. – jrh

Cuestiones relacionadas