处理了C#KeyPressEvents

时间:2011-07-11 09:34:27

标签: c# winforms events

我正在使用一个我想只允许数字的文本框,我发现这个说法有效。

e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);

但是为什么呢!char.IsDigit()而不是char.IsDigit()?为什么否定?不应该是,如果我输入一个数字,IsDigits会返回true,这就是我想要的吗?

6 个答案:

答案 0 :(得分:3)

此代码正在执行的操作是说如果没有按下数字并且它不是控制字符,则将事件标记为已处理,以便不会进行进一步处理。

因此,如果按下一个数字,则handle设置为false,以便事件继续传递并允许按键的正常处理逻辑发生。

作为澄清,请参阅Edwin de Konning评论,将Handled设置为True将阻止按键发生,因为它们将事件标记为已处理。这就是为什么操作不是。

该陈述在逻辑上等同于:

e.Handled = !(char.IsDigit(e.KeyChar) || !char.IsControl(e.KeyChar))

因此,如果字符是数字或控制字符(例如Ctrl + C),则不处理该事件。

但是,这不足以防止输入非数字字符,因为剪切和粘贴仍然有效。正如Edwin de Konnig建议的那样,你可能想看看MaskedEdit

答案 1 :(得分:2)

实际上是!char.IsDigit()!char.IsControl()。因此,如果角色是一个数字并且一个控制角色,它将忽略您的输入。我不确定这是否真的是你想要的(他们甚至是相互排斥的,正如Bob Vale所说)。也许您还应该考虑使用MaskedTextBox

答案 2 :(得分:2)

当拦截按键时,将e.Handled设置为true告诉框架该事件已经处理过,并且代表此按键操作不得执行任何操作。通过将所有不需要的按键标记为处理,您可以有效地过滤这些事件,只留下您想要查看的按键。

答案 3 :(得分:1)

你应该看看e.Handled做什么...当你把它设置为真时,不会在texbox中输入。

答案 4 :(得分:1)

让我们打破这个。

假设我们在键盘上点击1,究竟发生了什么。

  • !char.IsDigit(1)== fasle所以整体将自动为假,因为当我们使用&&如果第一次检查为假,则整个陈述变为假。

现在,如果我们查看e.Handled,我们会看到如果值assign为false,那么我们允许将值写入Textbox,如果值为true,则值为{{1}}不会被接受。

答案 5 :(得分:0)

上述方法有助于删除使用Shift等控制键所做的输入,这样就可以避免使用字母和特殊符号。

当您从键盘上打入数字时,没有按下控制键,因此结果为false,允许输入数字。 (您无法使用控制键输入数字)