¿Cómo convierto un valor de enumeración de “Claves” a un carácter “int” en C #?

Esto parece algo que debería ser fácil, pero me está costando entender qué es lo que tiene que pasar aquí.

En el controlador de eventos “KeyDown”, si el “e.KeyValue” es un número, quiero tratarlo como un número y almacenarlo como un int. Entonces, si presiono “8” en el teclado numérico, no quiero “Numpad8” Quiero el valor int 8 que puedo sumr o restar o lo que sea.

Entonces, ¿cómo puedo convertir de KeyValue a un int?

Yo iría con esta solución:

int value = -1; if (e.KeyValue >= ((int) Keys.NumPad0) && e.KeyValue <= ((int) Keys.NumPad9)) { // numpad value = e.KeyValue - ((int) Keys.NumPad0); } else if (e.KeyValue >= ((int) Keys.D0) && e.KeyValue <= ((int) Keys.D9)) { // regular numbers value = e.KeyValue - ((int) Keys.D0); } 

... si el punto era obtener el valor numérico de la etiqueta de la clave que fue insertada.

Algo como esto debería funcionar bien: (Editado)

 int keyVal = (int)e.KeyValue; int value = -1; if ((keyVal >= (int)Keys.D0 && keyVal <= (int)Keys.D9) { value = (int)e.KeyValue - (int)Keys.D0; } else if (keyVal >= (int)Keys.NumPad0 && keyVal <= (int)Keys.NumPad9) { value = (int)e.KeyValue - (int)Keys.NumPad0; } 

Hechos: el teclado tiene teclas. Algunas teclas representan números y otras no.

Problema (reformulado): ceda un valor numérico representado por una clave, si la clave representa un número.

Para resolver el problema, es necesario saber qué claves (fuera del conjunto de claves) representan números, así como el valor numérico exacto que representa cada clave (número).

Que yo sepa, no hay una manera fácil de obtener tal mapeo desde el marco.

Nota: El hecho de que D0-D9 y NumPad0-NamPad9 sean secuenciales en la enumeración de claves es accidental y la confianza en estos valores ordenados de forma secuencial es infundada.

Entonces la solución sería:

  1. Determine si la clave dada representa un número.
  2. Devuelve el valor numérico de la clave si la clave representa un número.

 private static readonly IDictionary NumericKeys = new Dictionary { { Keys.D0, 0 }, { Keys.D1, 1 }, { Keys.D2, 2 }, { Keys.D3, 3 }, { Keys.D4, 4 }, { Keys.D5, 5 }, { Keys.D6, 6 }, { Keys.D7, 7 }, { Keys.D8, 8 }, { Keys.D9, 9 }, { Keys.NumPad0, 0 }, { Keys.NumPad1, 1 }, { Keys.NumPad2, 2 }, { Keys.NumPad3, 3 }, { Keys.NumPad4, 4 }, { Keys.NumPad5, 5 }, { Keys.NumPad6, 6 }, { Keys.NumPad7, 7 }, { Keys.NumPad8, 8 }, { Keys.NumPad9, 9 } }; private int? GetKeyNumericValue(KeyEventArgs e) { if (NumericKeys.ContainsKey(e.KeyCode)) return NumericKeys[e.KeyCode]; else return null; } 

Podría decirse que no es la solución más simple, sino la que modela la solución de cerca.

Dependiendo de la cantidad de claves de las que esté realizando un seguimiento, el método más simple sería crear un caso de selección (o una instrucción de cambio en C # ¿Supongo?) Que verificará el valor de su reducción de teclas y dependiendo de ese valor asigne un valor un entero que es apropiado

Si desea valores NUMÉRICOS, deberá crear una switch(e.KeyCode) , evaluar la clave y crear su propio int. No hay una forma sencilla de convertir una clave en un valor numérico que represente el número en la clave. Lo más cerca que podría acercarse podría ser el equivalente ASCII, que aún debería ser traducido.

¿Podrías simplemente escuchar el evento KeyPress lugar? Se le dará al personaje que realmente fue presionado.

Esta función hará lo que quieras:

 private int GetKeyValue(int keyValue) { if (keyValue >= 48 && keyValue <= 57) { return keyValue - 48; } else if (keyValue >= 96 && keyValue <= 105) { return keyValue - 96; } else { return -1; // Not a number... do whatever... } } 

Llámalo así:

 private void Form1_KeyDown(object sender, KeyEventArgs e) { int num = GetKeyValue(e.KeyValue); } 

KeyValue representa el código de carácter de la tecla que se presionó. Para obtener su valor numérico, debe encontrar el carácter de la tecla que se presionó y luego analizarlo de un carácter a un entero.

Algo como Convert.ToInt32 (e.KeyCode.ToString ())

O crea un método de extensión y llámalo como

 private void Form1_KeyDown(object sender, KeyEventArgs e) { int num = e.KeyValue.GetKeyValue(); } 

donde el método de extensión es

 public static class MyExtensions { public static int GetKeyValue(this int keyValue) { if (keyValue >= 48 && keyValue <= 57) { return keyValue - 48; } else if (keyValue >= 96 && keyValue <= 105) { return keyValue - 96; } else { return -1; // Not a number... do whatever... } } } } 

int i = (int) e.KeyValue;