Comment convertir une valeur enum «Keys» en un caractère «int» en C #?

Cela semble être quelque chose qui devrait être facile, mais j’ai du mal à comprendre ce qui doit se passer ici.

Dans le gestionnaire d’événements “KeyDown”, si “e.KeyValue” est un nombre, je souhaite le traiter comme un nombre et le stocker sous la forme d’un entier. Donc, si je tape “8” sur le pavé numérique, je ne veux pas de “Numpad8”, je veux la valeur int 8 que je peux append ou soustraire, peu importe.

Alors, comment convertir une KeyValue en un int?

J’irais avec cette solution:

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 le but était d'obtenir la valeur numérique de l'étiquette de la clé qui a été insérée.

Quelque chose comme ça devrait bien fonctionner: (Edité)

 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; } 

Faits: Le clavier a des touches. Certaines clés représentent des nombres et d’autres non.

Problème (reformulé): donne une valeur numérique représentée par une clé, si la clé représente un nombre.

Pour résoudre le problème, il est nécessaire de savoir quelles touches (hors jeu de toutes les touches) représentent des nombres ainsi que la valeur numérique exacte que chaque touche (nombre) représente.

À ma connaissance, il n’existe pas de moyen facile d’obtenir une telle cartographie à partir du cadre.

Remarque: le fait que D0-D9 et NumPad0-NamPad9 soient séquentiels dans l’énumération Keys est accidentel et que le fait de se fier à l’ordre séquentiel de ces valeurs n’est pas fondé.

Donc, la solution serait:

  1. Déterminer si la clé donnée représente un nombre.
  2. Renvoie la valeur numérique de la clé si la clé représente un nombre.

 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; } 

On peut soutenir que ce n’est pas la solution la plus simple, mais celle qui la modélise de près.

Selon le nombre de clés que vous gardez en mémoire, la méthode la plus simple consiste à créer un cas sélectionné (ou une instruction switch en C #, je suppose?) Qui vérifierait la valeur de votre touche enfoncée et, en fonction de cette valeur, atsortingbuer une valeur à un entier approprié.

Si vous voulez des valeurs NUMERIC, vous devez créer une switch(e.KeyCode) , évaluer la clé et créer votre propre int. Il n’y a pas de moyen simple de transformer une clé en une valeur numérique qui représente le nombre sur la clé. Le plus proche que vous puissiez obtenir pourrait être l’équivalent ASCII, qui aurait encore besoin d’être traduit.

Pourriez-vous simplement écouter l’événement KeyPress place? Cela donnera le personnage qui a été réellement pressé.

Cette fonction fera ce que vous voulez:

 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... } } 

Appelez ça comme ça:

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

KeyValue représente le code de caractère de la touche sur laquelle vous avez appuyé. Pour obtenir sa valeur numérique, vous devez trouver le caractère de la touche sur laquelle vous avez appuyé, puis l’parsingr d’un caractère à un entier.

Quelque chose comme Convert.ToInt32 (e.KeyCode.ToSsortingng ())

Ou créez une méthode d’extension et appelez-la comme

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

où la méthode d’extension est

 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;