Как преобразовать значение перечисления "Keys" в символ "int" в C#?

Кажется, это должно быть легко, но мне тяжело понять, что здесь должно произойти.

В обработчике событий "KeyDown", если "e.KeyValue" - это число, я хочу обработать его как число и сохранить как int. Так что, если я нажму "8" на цифровой клавиатуре, я не хочу "Numpad8", я хочу значение 8, которое я могу добавить или вычесть или что-то еще.

Итак, как мне конвертировать из KeyValue в int?

12 ответов

Решение

Я бы пошел с этим решением:

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

... если цель состояла в том, чтобы получить числовое значение метки ключа, который был пробит.

Факты: на клавиатуре есть клавиши. Некоторые ключи представляют цифры, а некоторые нет.

Проблема (перефразированная): получить числовое значение, представленное ключом, если ключ представляет число.

Для решения этой проблемы необходимо знать, какие ключи (из набора всех ключей) представляют собой числа, а также точное числовое значение, которое представляет каждая (числовая) клавиша.

Насколько мне известно, нет простого способа получить такое отображение из фреймворка.

Примечание. Тот факт, что D0-D9 и NumPad0-NamPad9 являются последовательными в перечислении ключей, является случайным, и полагаться на упорядочение этих значений последовательно необоснованно.

Таким образом, решение будет:

  1. Определите, представляет ли данный ключ число.
  2. Возвращает числовое значение ключа, если ключ представляет число.

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

Возможно, не самое простое решение, но то, которое близко моделирует решение.

Примерно так должно хорошо работать: (отредактировано)

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

В зависимости от того, сколько ключей вы отслеживаете, самый простой способ будет для вас создать регистр выбора (или, я полагаю, оператор переключения в C#), который будет проверять значение вашего нажатия клавиш и в зависимости от этого значения назначать значение для целое число, которое подходит.

Если вы хотите числовые значения, вам нужно создать switch(e.KeyCode) Скажите и оцените ключ и создайте свой собственный int. Там нет простого способа повернуть Keys в числовое значение, которое представляет число на ключе. Самое близкое, что вы можете получить, может быть эквивалент ASCII, который все равно нужно будет перевести.

Эта функция будет делать то, что вы хотите:

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

Не могли бы вы просто послушать KeyPress событие вместо? Это даст характер, который был фактически нажат.

KeyValue представляет код символа для нажатой клавиши. Чтобы получить его числовое значение, вы должны найти символ для нажатой клавиши, а затем проанализировать его от символа до целого числа.

Что-то вроде Convert.ToInt32(e.KeyCode.ToString())

Я использовал этот двухстрочный простой код:

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

Альтернатива тому, что опубликовал Карлос Феррейра.

Или создайте метод расширения и назовите его как

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;

Другие вопросы по тегам