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

C# KeyDown事件-如何轻松知道按下的键是否为数字?,c#,datagridview,keydown,C#,Datagridview,Keydown,我目前正在处理DataGridView控件的KeyDown事件。 其中一列由计算值填充,我希望用户能够根据需要覆盖单元格值 当用户按下数字键时,单元格进入编辑模式并允许用户覆盖该值。如果键不是数字,则不会发生任何事情 这是非常好的工作。。。问题是我发现它的代码很难看。。。 我似乎找不到一种简单的方法在一个条件下处理所有的数字键,所以我制作了一个switch-case构造来处理所有可能的数字键,如下所示: switch (e.KeyCode)

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

当用户按下数字键时,单元格进入编辑模式并允许用户覆盖该值。如果键不是数字,则不会发生任何事情

这是非常好的工作。。。问题是我发现它的代码很难看。。。 我似乎找不到一种简单的方法在一个条件下处理所有的数字键,所以我制作了一个switch-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转换成字符,但当使用数字键时,它甚至会为数字值提供字母

谢谢。

在示例中,他们使用以下代码:

// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
//确定击键是否为键盘顶部的数字。
如果(e.KeyCodeKeys.D9)

//确定击键是否为键盘上的数字。
if(e.KeyCodeKeys.NumPad9)
试试看


if((e.KeyCode>=Keys.D0&&e.KeyCode=Keys.NumPad0&&e.KeyCode如果使用
KeyPress
事件,则事件签名有一个
KeyPressEventArgs
成员,该成员为您提供numberpad键的字符。您可以对其进行三次搜索以确定其是否为数字

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}
void dataGridView1\u KeyDown(对象发送方,System.Windows.Forms.KeyEventArgs e)
{
//使用此选项可以查找关键值。
//label1.Text+=e.KeyValue;
//检查键是否为数值。

如果((e.KeyValue>=48&&e.KeyValue=97&&e.KeyValue为什么要使用keycodes,如果可以使用此选项:

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

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

它更干净,即使microsoft决定更改所有Enum vlue,它仍然可以工作

魔术师86PT的解决方案是最简单的,但是,当用户按下控制键(如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)
这是我收集的有用函数之一。
您可以找到它。

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

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

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

更精简的版本:

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

@Rawling,@tanascius:谢谢,我确实考虑过这一点,但我认为对枚举执行范围求值是一种不好的做法?我同意,它来自MSDN这一事实使它相对安全,但毕竟,这不是我们第一次看到来自MSDN的坏示例代码……有什么可以保证值始终是连续的?毕竟,我们有枚举,因此不依赖于基础值?通过执行这样的检查,我不是依赖于这些枚举值将彼此连续的事实吗?谢谢。尽管这可能是一种糟糕的做法,但我希望,由于Microsoft在其文档中使用了它,因此他们将e注意保持行为的一致性。如果你可以切换到按键事件而不是按下键,你可以使用我提供的解决方案。是的,如果有理由不这样做,Tim的解决方案是好的,并且使你试图做的事情更加明显。@Kharlos:我理解你的问题,但想想他们会有什么问题更改以使代码中断。只要不更改NumPad?和D?元素的顺序,枚举就可以更改而不会出现任何问题。我认为没有理由在以前定义NumPad9"NumPad8…是的,我同意你的看法,他们不太可能这么做。这更像是一个修辞问题,而不是现实世界中的问题,但如果我可以,我最好不要尝试打破一个最佳实践,即使它不太可能在现实世界中造成任何问题。谢谢蒂姆和罗琳。这是我采用的解决方案。我还必须处理一个问题KeyDown中的按键事件…我更愿意将其保持在同一位置,但此代码看起来是迄今为止最好的。也感谢所有其他人。标记的ans是正确的,但--telerikGrid不支持按键。这很有效!作为补充说明,这将不允许按退格键以及除数字以外的任何键。小心使用此方法,因为它不考虑数字键盘值(NumPad0=96='d')
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;
    }
}
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;
}
    private void KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
    }