9

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

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

那么,如何将 KeyValue 转换为 int?

4

11 回答 11

17

我会选择这个解决方案:

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

...如果关键是要获取被打入的他们键的标签的数值。

于 2009-04-20T18:43:15.320 回答
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;
}
于 2009-04-20T18:48:08.197 回答
5

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

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

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

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

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

所以解决方案是:

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

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

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

于 2009-04-20T21:20:39.467 回答
2

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

于 2009-04-20T18:43:11.390 回答
2

根据您要跟踪的键的数量,最简单的方法是让您创建一个选择案例(或者我猜是 C# 中的 switch 语句?),它将检查您的 keydown 的值并根据该值分配一个值一个合适的整数。

于 2009-04-20T18:34:23.237 回答
1

你可以只听这个KeyPress事件吗?它将给出实际按下的字符。

于 2009-04-20T18:43:53.917 回答
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);  
}
于 2009-04-20T18:47:02.253 回答
0

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

类似 Convert.ToInt32(e.KeyCode.ToString())

于 2009-04-20T18:46:39.370 回答
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...    }

        }
    }
}
于 2009-04-20T18:59:55.127 回答
0

我使用了这 2 行简单的代码:

string key = e.KeyCode.ToString();

if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
于 2019-10-17T14:54:33.513 回答
-3

int i = (int)e.KeyValue;

于 2009-04-20T18:35:36.917 回答