C#处理按键操作

6
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar < '0' || e.KeyChar > '9')
        if (e.KeyChar != '\b')
            e.Handled = true;

}

我不理解这段代码是如何只允许退格和数字输入的。

  1. 第一个if语句是在说如果不是0-9就什么也不做?
  2. 第二个if语句是在说如果不是退格键就什么也不做?
  3. e.Handled=True是什么意思?
3个回答

15

第一个if语句的基本含义是,如果它是数字,就允许它像平常一样继续进行——否则进入第二个if语句。

第二个if语句是说,如果它也不是退格键,就允许它像平常一样继续进行——否则转到赋值语句。

e.Handled = true; 表示该事件处理程序已经处理了事件并进行了处理,因此无需进一步处理。换句话说,请不要采取任何进一步的行动。

这里是写同样代码体的另一种方法:

bool isDigit = e.KeyChar >= '0' && e.KeyChar <= '9';
bool isBackspace = e.KeyChar == '\b';

// If we get anything other than a digit or backspace, tell the rest of
// the event processing logic to ignore this event
if (!isDigit && !isBackspace)
{
    e.Handled = true;
}

我非常喜欢你重构代码的方式,因为一旦你到达if语句,就非常容易理解逻辑。 - Ben McCormack
@Jon Skeet,我看了你的回答,我有一个问题想问你。我已经将事件附加到我的TextBox上,当我按下“+”符号时,它会被触发,这个事件基本上“解锁”了我的TextBox,而在我写e.Handled=true;之前,每次我想用“+”键解锁TextBox时,该键也会出现在TextBox中,但是当我添加了e.Handled=true;后,“+”符号停止出现在我通过按下该符号来解锁的TextBox中了,这是为什么?能否请您解释一下,我非常感激您的话。或者如果您愿意,我可以开一个新的问题,并在此处留下链接。 - Roxy'Pro
1
@Roxy'Pro:你应该一定使用 [mcve] 发布一个新问题。基本上,如果你将 e.Handled 设置为 true,就意味着你已经处理了事件,因此 TextBox 不会 响应按键。 - Jon Skeet
@JonSkeet 非常感谢你,伙计! - Roxy'Pro

2

1和2:实际上是相反的。这意味着“如果键不是0-9,则检查它是否为退格键。如果不是退格键,则将e.Handled设置为true。”

3:当e.Handled设置为true时,控件、父窗体以及其他监听按键操作的对象都不会做任何事情。e.Handled基本上表示:“已经处理好了,其他人不用担心它。”


1
这段代码的作用是在以下情况下设置e.Handled=true
  • 字符不是数字字符
  • 字符不是退格符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接