Как преобразовать значение перечисления «Keys» в символ «int» в C #? - PullRequest
7 голосов
/ 20 апреля 2009

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

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

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

Ответы [ 10 ]

15 голосов
/ 20 апреля 2009

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

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

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

5 голосов
/ 21 апреля 2009

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

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

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

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

Примечание. Тот факт, что 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;
}

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

5 голосов
/ 20 апреля 2009

Что-то вроде этого должно работать хорошо: (отредактировано)

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 голосов
/ 20 апреля 2009

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

2 голосов
/ 20 апреля 2009

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

1 голос
/ 20 апреля 2009

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

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);  
}
1 голос
/ 20 апреля 2009

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

0 голосов
/ 20 апреля 2009

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

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

        }
    }
}
0 голосов
/ 20 апреля 2009

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

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

0 голосов
/ 20 апреля 2009

int i = (int) e.KeyValue;

...