KeyDown event-как легко узнать, является ли нажатая клавиша числовой?

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

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

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

                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 к char, но при использовании числовых ключей, он идет дает буквы даже для числовых значений...

спасибо.

8 ответов


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

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}

попробовать

if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
    (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
    e.KeyCode == Keys.Decimal)
{
    // Edit mode
}

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

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

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

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


решение 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, вы можете обнаружить, что текстовое поле не имеет события нажатия клавиши. Чтобы исправить это, я использовал следующий код.

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) это одна из полезных функций, которые я собрал. Ты можешь найти его. здесь.


просто получите последний символ от ключа, который будет номером, если номер был нажат. Этот метод работает с событиями 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;
}

на страница справки 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)

немного сокращенный вариант:

    private void KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
    }

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