KeyDown event - how to easily know if the key pressed is numeric?

后端 未结 8 1880
天命终不由人
天命终不由人 2020-12-19 03:00

I am currently handling the KeyDown event of a DataGridView control. One of the columns is filled by calculated values and I want the user to be able to override the cell va

相关标签:
8条回答
  • 2020-12-19 03:31

    Try

    if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
        (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
        e.KeyCode == Keys.Decimal)
    {
        // Edit mode
    }
    
    0 讨论(0)
  • 2020-12-19 03:31
    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");
    }
    
    0 讨论(0)
  • 2020-12-19 03:38

    Why use keycodes, when you can use this:

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

    It's cleaner and even if microsoft decides to change all enums vlue, it still would work

    0 讨论(0)
  • 2020-12-19 03:39

    If you use the KeyPress event, the event signature has a KeyPressEventArgs with a KeyChar member that gives you the character for the numberpad keys. You can do a TryParse on that to figure out if its a number or not.

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        int i;
        if (int.TryParse(e.KeyChar.ToString(), out i))
        {
            MessageBox.Show("Number");
        }
    }
    
    0 讨论(0)
  • 2020-12-19 03:39

    A bit more condensed version:

        private void KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
        }
    
    0 讨论(0)
  • 2020-12-19 03:45

    Sorcerer86pt's solution was the simplest, however, when a user presses a control key, like backspace, then it breaks. To solve that problem, you can use the following snippet:

    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
    }
    

    If you're using WPF, you might find that a TextBox doesn't have a KeyPressed event. To fix this, I used the following code.

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

    You may notice the weird function call WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key) this is one of the useful functions I've collected. You can find it here.

    0 讨论(0)
提交回复
热议问题