Более эффективный способ проверки KeyCodes на событии KeyDown - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь запустить событие и выполнить некоторую работу, когда пользователь пытается ввести только полезные данные в поле формы, используя событие KeyDown.Но я продолжаю получать ложные тревоги, потому что событие KeyDown работает только для любого ключа!

Я пытаюсь не запускать событие для таких кнопок, как «Alt, Control, Shift, Esc, F-клавиши и т. Д.»Какой лучший способ сделать это?

То, что у меня есть на данный момент, таково:

    private void formControl_KeyModified(object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Shift && e.KeyCode != Keys.CapsLock && e.KeyCode != Keys.Tab && e.KeyCode != Keys.Escape &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && e.KeyCode != Keys.PageUp &&
            e.KeyCode != Keys.PageDown && e.KeyCode != Keys.Up && e.KeyCode != Keys.Down && e.KeyCode != Keys.Left &&
            e.KeyCode != Keys.Right && e.KeyCode != Keys.Control && e.KeyCode != Keys.Alt && e.KeyCode != Keys.NumLock &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.None && e.KeyCode != Keys.PrintScreen && e.KeyCode != Keys.Help &&
            e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Sleep && e.KeyCode != Keys.LWin &&
            e.KeyCode != Keys.RWin && e.KeyCode != Keys.RMenu && e.KeyCode != Keys.LMenu && e.KeyCode != Keys.LShiftKey &&
            e.KeyCode != Keys.RShiftKey && e.KeyCode != Keys.Pause && e.KeyCode != Keys.F1 && e.KeyCode != Keys.F2 &&
            e.KeyCode != Keys.F3 && e.KeyCode != Keys.F4 && e.KeyCode != Keys.F5 && e.KeyCode != Keys.F6 && e.KeyCode != Keys.F7 &&
            e.KeyCode != Keys.F8 && e.KeyCode != Keys.F9 && e.KeyCode != Keys.F10 && e.KeyCode != Keys.F11 && e.KeyCode != Keys.F12 &&
            e.KeyCode != Keys.L)
        {
             // Do some work...
        }
    }

Однако это не совсем лучший способ справиться со мной. Опять же, я просто пытаюсь получить ключи для символов, которые можно ввести в текстовое поле (например, 213135udf! @ #% @! # @ #% 15nfaosdf ~! @} {:?>,и так далее)!Любая помощь будет оценена, спасибо!

С уважением, Исаак Д.

(отредактировано для ясности и качества)

Ответы [ 5 ]

1 голос
/ 13 мая 2011

вы можете, например (есть много удачных попыток) проверить эту страницу для получения справки по классу Char, где вы можете использовать такие методы, как IsLetterOrDigit или другие функции.Теперь я не могу узнать, используете ли вы Windows Forms?Если это так, используйте простое приведение типа (char)e.KeyCode, чтобы получить чар.

Пример:

private void formControl_KeyModified(object sender, KeyEventArgs e)
{
    char c = (char)e.KeyCode;
    if (Char.IsLetterOrDigit(c)) {
        // useful
    }
    // might add more checks
    // else if (Char.IsPunctuation(c)) ...
}
1 голос
/ 13 мая 2011

Вы можете бросить все значения в HashSet<T> и проверить, находится ли KeyCode в наборе.

var invalidKeys = new HashSet<Keys> { Keys.Shift, Keys.CapsLock, Keys.Tab, ... Keys.L };
if (!invalidKeys.Contains(e.KeyCode))
{
    // Do some work...
}

Или, альтернативно, поскольку вы проверяете равенство, вымог просто бросить все это в оператор switch.

switch (e.KeyCode)
{
case Keys.Shift:
case Keys.CapsLock:
case Keys.Tab:
// ...
case Keys.L:
    break;
default:
    // Do some work...
    break;
}
0 голосов
/ 13 мая 2011

Как @Daniel заявляет в своем комментарии, возможно, белый список допустимых ключей предпочтительнее, чем черный список всех тех, которые вас не интересуют.Итак, если, скажем, вас интересуют только буквенные ключи и цифры, вы можете сделать это так же, как это описано в примере с ключами MSDN

if(e.KeyCode > Keys.NumPad0 && e.KeyCode < Keys.NumPad9 ||
   e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 ||
   e.KeyCode > Keys.A && e.KeyCode < Keys.Z) {

    //do useful stuff here
}
0 голосов
/ 13 мая 2011

Если вас интересует время выполнения оператора if, создайте SortedList значений Key и проверьте, содержит ли SortedList ваш ключ.

Возможно, лучшим решением является использование события TextCox "Forms TextBox" вместо использования события KeyDown.

0 голосов
/ 13 мая 2011

Вы можете обработать событие KeyPress формы.Упомянутое событие принимает в качестве параметра аргументов KeyPressEventArgs .

Используйте функцию Char.IsLetterOrDigit , чтобы проверить значение KeyPressEventArgs.KeyChar свойство.

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     if (char.IsLetterOrDigit(e.KeyChar)) {}
     else { e.Handled = false; }

}

РЕДАКТИРОВАТЬ:

Вы также можете попытаться составить список принятых вами Char значений, а затем проверить, если пресеять символВ него включено:

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     List<Char> charList = new List<Char>;
     charList.AddRange(new Char[] { 'a', 'b' ... });

     if (charList.Contains(e.KeyChar)) {}
     else { e.Handled = false; }

}

Возможно, вам придется рассмотреть возможность объединения обоих способов или даже большего, чтобы выполнить ваши требования.

...