10

我目前正在处理 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 转换为字符,但是当使用数字键时,它甚至会为数字值提供字母......

谢谢。

4

8 回答 8

18

尝试

if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
    (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
    e.KeyCode == Keys.Decimal)
{
    // Edit mode
}
于 2010-07-01T11:06:30.543 回答
15

如果您使用该KeyPress事件,则事件签名具有一个KeyPressEventArgswithKeyChar成员,该成员为您提供数字键盘键的字符。您可以对其进行 TryParse 以确定其是否为数字。

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}
于 2010-07-01T11:10:37.630 回答
8

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),这是我收集的有用函数之一。你可以在这里找到它。

于 2012-08-15T13:32:15.743 回答
7

为什么要使用键码,什么时候可以使用:

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

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

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

于 2011-09-08T10:12:52.593 回答
2

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)
于 2010-07-01T11:05:59.293 回答
2

如果按下数字,只需从 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;
}
于 2013-06-07T07:00:45.700 回答
2

更精简的版本:

    private void KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
    }
于 2014-09-02T13:53:54.697 回答
0
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");
}
于 2010-07-01T11:16:44.853 回答