这似乎应该很容易,但我很难弄清楚这里需要发生什么。
在“KeyDown”事件处理程序中,如果“e.KeyValue”是一个数字,我想将其视为数字并将其存储为int。所以,如果我在数字键盘上点击“8”,我不想要“Numpad8”我想要我可以加或减的int值8或者其他什么。
那么,我如何从KeyValue转换为int?
答案 0 :(得分:15)
我会选择这个解决方案:
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);
}
...如果要获得被打孔的钥匙标签的数值。
答案 1 :(得分:5)
这样的事情应该运作良好:(编辑)
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;
}
答案 2 :(得分:5)
事实: 键盘有键。 有些键代表数字,有些则没有。
问题(改写): 如果键表示数字,则生成由键表示的数值。
要解决此问题,必须知道哪些键(所有键中的一组)代表数字以及每个(数字)键代表的精确数值。
据我所知,没有一种简单的方法可以从框架中获得这样的映射。
注意:Dum-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;
}
可以说,不是最简单的解决方案,而是密切建模解决方案的解决方案。
答案 3 :(得分:2)
根据您要跟踪的密钥数量,最简单的方法是创建一个select case(或C#中的switch语句,我猜?),它将检查keydown的值并根据该值赋值一个适当的整数值。
答案 4 :(得分:2)
如果您需要NUMERIC值,则必须创建switch(e.KeyCode)
语句并评估密钥并创建自己的int。没有简单的方法可以将Keys
转换为表示键上数字的数值。您可以获得的最接近的可能是ASCII等价物,仍然需要翻译。
答案 5 :(得分:1)
您是否可以直接听取KeyPress
事件?它会给出实际按下的角色。
答案 6 :(得分:1)
此功能可以满足您的需求:
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);
}
答案 7 :(得分:0)
KeyValue表示按下的键的字符代码。 为了获得它的数值,您应该找到按下的键的字符,然后将其从字符解析为整数。
像Convert.ToInt32(e.KeyCode.ToString())
答案 8 :(得分:0)
或者创建一个扩展方法并将其称为
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... }
}
}
}
答案 9 :(得分:0)
我使用了以下两行简单代码:
string key = e.KeyCode.ToString();
if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
答案 10 :(得分:-3)
int i =(int)e.KeyValue;