[英]How do I convert a "Keys" enum value to an "int" character in C#?
这似乎应该很容易,但我很难弄清楚这里需要发生什么。
在“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;
}
可以说,这不是最简单的解决方案,而是对解决方案进行建模的一种方法。
根据要跟踪的键数,最简单的方法是为您创建一个选择案例(我猜是C#中的switch语句?),该案例将检查keydown的值,并根据该值将值分配给一个合适的整数。
如果需要NUMERIC值,则必须创建一个switch(e.KeyCode)
语句并评估键并创建自己的int。 没有简单的方法可以将“ Keys
转换为代表Keys
数字的数字值。 您可以获得的最接近的值可能是ASCII等效值,仍然需要翻译。
您可以只听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);
}
我使用了以下两行简单代码:
string key = e.KeyCode.ToString();
if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
这是获取可用值的另一种方法:
string key
if (((int)e.Key < 84 && (int)e.Key > 73) || ((int)e.Key < 44 && (int)e.Key > 33))
{
key = ((int)e.Key - 4).ToString();
key = key.Remove(0,1);
}
替代 Carlos Ferreira 发布的内容。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.