如何在C#中将“Keys”枚举值转换为“int”字符?

这似乎应该很容易,但我很难搞清楚这里需要发生什么。

在“KeyDown”事件处理程序中,如果“e.KeyValue”是一个数字,我想将其视为一个数字并将其存储为int。 所以,如果我在数字键盘上点击“8”,我不想要“Numpad8”我想要我可以加或减的int值8或者其他什么。

那么,我如何从KeyValue转换为int?

我会选择这个解决方案:

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

...如果要点是获得被打孔的键的标签的数值。

像这样的东西应该运作良好:(编辑)

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

事实:键盘有键。 有些键代表数字,有些则没有。

问题(改写):如果键表示数字,则产生由键表示的数值。

为了解决这个问题,有必要知道哪些键(所有键中的一组)代表数字以及每个(数字)键代表的精确数值。

据我所知,没有一种简单的方法可以从框架中获得这样的映射。

注意:事实D0-D9和NumPad0-NamPad9在Keys枚举中是顺序的是偶然的,并且依赖于按顺序排序的这些值是没有根据的。

所以解决方案是:

  1. 确定给定的键是否代表数字。
  2. 如果key表示数字,则返回键的数值。

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

可以说,不是最简单的解决方案,而是密切建模解决方案的解决方案。

根据您要跟踪的密钥数量,最简单的方法是创建一个select case(或C#中的switch语句,我猜?),它会检查你的keydown的值,并根据该值赋值给一个合适的整数。

如果需要NUMERIC值,则必须创建一个switch(e.KeyCode)语句并评估该键并创建自己的int。 没有简单的方法可以将Keys转换为表示Keys数字的数值。 您可以获得的最接近的可能是ASCII等价物,仍然需要翻译。

你能不能只听一下KeyPress活动? 它会给出实际按下的角色。

这个function可以做你想要的:

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

这样称呼它:

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

KeyValue表示按下的键的字符代码。 为了获得它的数值,您应该找到按下的键的字符,然后将其从字符解析为整数。

像Convert.ToInt32(e.KeyCode.ToString())

或者创建一个扩展方法并调用它

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

扩展方法的位置

 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;