这似乎应该很容易,但我很难弄清楚这里需要发生什么。
在“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 枚举中是连续的这一事实是偶然的,依赖这些值按顺序排序是没有根据的。
所以解决方案是:
private static readonly IDictionary<Keys, int> NumericKeys =
new Dictionary<Keys, int> {
{ 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;
}
可以说,这不是最简单的解决方案,而是对解决方案进行密切建模的解决方案。
如果您想要 NUMERIC 值,则必须创建一个switch(e.KeyCode)
语句并评估键并创建您自己的 int。没有简单的方法可以将 aKeys
转换为代表键上数字的数值。您可以获得的最接近的可能是 ASCII 等价物,但仍需要翻译。
根据您要跟踪的键的数量,最简单的方法是让您创建一个选择案例(或者我猜是 C# 中的 switch 语句?),它将检查您的 keydown 的值并根据该值分配一个值一个合适的整数。
你可以只听这个KeyPress
事件吗?它将给出实际按下的字符。
此功能将执行您想要的操作:
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... }
}
}
}
我使用了这 2 行简单的代码:
string key = e.KeyCode.ToString();
if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
int i = (int)e.KeyValue;