Событие KeyDown - как легко узнать, является ли нажатая клавиша числовой? - PullRequest
9 голосов
/ 01 июля 2010

В настоящее время я обрабатываю событие KeyDown элемента управления DataGridView.Один из столбцов заполнен вычисленными значениями, и я хочу, чтобы пользователь мог переопределить значение ячейки, если он хочет.

Когда пользователь нажимает цифровую клавишу, ячейка переходит в режим редактирования и позволяет пользователюпереопределить значение.Если ключ не числовой, ничего не происходит ...

Это работает довольно хорошо ... Проблема в том, что я нахожу код для него некрасивым ... Кажется, я не могу найти аккуратный способдля обработки всех числовых клавиш в одном условии, поэтому я создал конструкцию case переключения для обработки всех возможных числовых клавиш, например:

                switch (e.KeyCode)
                {
                    case Keys.D0:
                    case Keys.D1:
                    case Keys.D2:
                    case Keys.D3:
                    case Keys.D4:
                    case Keys.D5:
                    case Keys.D6:
                    case Keys.D7:
                    case Keys.D8:
                    case Keys.D9:
                    case Keys.Decimal:
                    case Keys.NumPad0:
                    case Keys.NumPad1:
                    case Keys.NumPad2:
                    case Keys.NumPad3:
                    case Keys.NumPad4:
                    case Keys.NumPad5:
                    case Keys.NumPad6:
                    case Keys.NumPad7:
                    case Keys.NumPad8:
                    case Keys.NumPad9:

                         [code to make the cell go to editMode, etc...]

Конечно, это работает, но нужнобыть лучше и короче, не так ли?

Все, что я мог найти с помощью Google, это преобразование e.KeyCode в символ, но при использовании цифровых клавиш он дает буквы даже для числовых значений ...

Спасибо.

Ответы [ 8 ]

14 голосов
/ 01 июля 2010

Попробуйте

if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
    (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
    e.KeyCode == Keys.Decimal)
{
    // Edit mode
}
11 голосов
/ 01 июля 2010

Если вы используете событие KeyPress, подпись события имеет KeyPressEventArgs с элементом KeyChar, который дает вам символ для клавиш цифровой клавиатуры.Вы можете сделать TryParse, чтобы выяснить, является ли это число или нет.

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}
7 голосов
/ 08 сентября 2011

Зачем использовать коды клавиш, когда вы можете использовать это:

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (Char.IsDigit(e.KeyChar))
        {
            //do something
        }
        else
        {
            //do something else
        }
    }

Это чище, и даже если Microsoft решит изменить все перечисления vlue, все равно будет работать

6 голосов
/ 15 августа 2012

Решение Sorcerer86pt было самым простым, однако, когда пользователь нажимает управляющую клавишу, например, клавишу Backspace, он ломается. Чтобы решить эту проблему, вы можете использовать следующий фрагмент:

void KeyPress(object sender, KeyPressEventArgs e)
{    
    if(!Char.IsNumber(e.KeyChar) && !Char.IsControl(e.KeyChar))
    {
        //The char is not a number or a control key
        //Handle the event so the key press is accepted
        e.Handled = true;
        //Get out of there - make it safe to add stuff after the if statement
        return;
    }
    //e.Handled remains false so the keypress is not accepted
}

Если вы используете WPF, вы можете обнаружить, что TextBox не имеет события KeyPressed. Чтобы исправить это, я использовал следующий код.

void ValidateKeyPress(object sender, KeyEventArgs e)
{
    char keyPressed = WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key);
    if (!Char.IsNumber(keyPressed) && !Char.IsControl(keyPressed))
    {
        //As above
        e.Handled = true;
        return;
    }
}

Вы можете заметить странный вызов функции WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key), это одна из полезных функций, которые я собрал. Вы можете найти это здесь .

2 голосов
/ 07 июня 2013

Просто получите последний символ от клавиши, который будет номером, если номер был нажат.Этот метод работает с событиями KeyDown, не требующими каких-либо других условий.

Просто вызовите этот статический метод и передайте ключ для проверки

public static bool IsNumber(Keys key)
{
  string num = key.ToString().Substring(key.ToString().Length - 1);
  Int64 i64;
  if (Int64.TryParse(num, out i64))
  {
    return true;               
  }
  return false;
}
1 голос
/ 02 сентября 2014

Чуть более сжатая версия:

    private void KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
    }
1 голос
/ 01 июля 2010

На странице справки msdn они используют этот код в своем примере:

// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)

...

// Determine whether the keystroke is a number from the keypad.
if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
0 голосов
/ 01 июля 2010
void dataGridView1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Used this to find they key values.
    //label1.Text += e.KeyValue;

    // Check if key is numeric value.
    if((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 97 && e.KeyValue <= 105))
        System.Console.WriteLine("Pressed key is numeric");
}
...