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

Kha*_*uez 9 c# datagridview keydown

我目前正在处理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...]
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Raw*_*ing 14

尝试

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


Tim*_*ker 11

如果您使用该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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至是e.KeyChar.IsDigit()? (4认同)

Sor*_*6pt 7

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

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (Char.IsDigit(e.KeyChar))
        {
            //do something
        }
        else
        {
            //do something else
        }
    }
Run Code Online (Sandbox Code Playgroud)

它更干净,即使微软决定改变所有的enums vlue,它仍然会工作


Kia*_*ian 6

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
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能会注意到奇怪的函数调用,WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key)这是我收集的有用函数之一.你可以在这里找到它.