首页 文章

KeyDown事件 - 如何轻松知道按下的键是否为数字?

提问于
浏览
8

我目前正在处理DataGridView控件的KeyDown事件 . 其中一列由计算值填充,我希望用户能够在需要时覆盖单元格值 .

当用户按下数字键时,单元格进入EditMode并允许用户覆盖该值 . 如果密钥不是数字,则没有任何反应......

这工作得很好......问题是我发现它的代码很难看...我似乎找不到一个简洁的方法来处理单个条件下的所有数字键,所以我做了一个开关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...]

当然,它有效,但必须有更好更短的方式,对吧?

我用谷歌找到的只是将e.KeyCode转换为char,但是当使用数字键时,它甚至会为数字值提供字母...

谢谢 .

8 回答

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

    尝试

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

    如果使用 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");
        }
    }
    
  • 1

    Sorcerer86pt的解决方案是最简单的,但是,当用户按下控制键(如退格键)时,它就会中断 . 要解决该问题,您可以使用以下代码段:

    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) 这是我收集的有用函数之一 . 你可以找到here .

  • 7

    更浓缩版本:

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

    为什么使用密钥代码,当你可以使用它:

    void Control_KeyPress(object sender, KeyPressEventArgs e)
        {
    
            if (Char.IsDigit(e.KeyChar))
            {
                //do something
            }
            else
            {
                //do something else
            }
        }
    

    它更干净,即使微软决定改变所有的枚举,它仍然可以工作

  • 6

    msdn help page上,他们在他们的示例中使用此代码:

    // 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)
    
  • 10

    如果按下一个数字,只需从Key键中获取最后一个字符 . 此方法适用于不需要任何其他条件的KeyDown事件 .

    只需调用此静态方法并传入Key进行检查

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

相关问题