如果在没有任何其他键的情况下按下 Control 键,则不会引发 Keypress 事件。仅用作键修饰符。在这种情况下,e.KeyChar 返回 char.IsLetter() 认为 false 的修改值,! 运算符将其转换为 true 并将其分配给 e.Handled,从而取消按键事件。
捕获用户输入的击键以限制用户输入
字母和数字值。
如果如您所说,数字是所需输入的一部分,则应使用char.IsLetterOrDigit() 而不是char.IsLetter()。
还有标点符号?也是输入的一部分吗?
这些符号被char.IsPunctuation() 视为标点符号:\"%&/()?*@.,:;_-'
两种方法得到相同的结果。
在两者中,char.IsControl(e.KeyChar) 用于检查 Control 是否是 Keycode 的一部分,如果是,则通过 XOR(ing) 将其剥离。
1) 使用简单的正则表达式进行过滤。这让您可以更好地控制要过滤的内容。
Regex _KeyFilter = new Regex(@"^[a-zA-Z0-9.,]");
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
{
e.Handled = !_KeyFilter.IsMatch((char.IsControl(e.KeyChar)
? (char)(e.KeyChar ^ 64)
: e.KeyChar).ToString());
}
}
2) 使用char.IsLetterOrDigit() 和char.IsPunctuation() 过滤
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
{
char _keypress = char.IsControl(e.KeyChar) ? (char)(e.KeyChar ^ 64) : e.KeyChar;
e.Handled = !char.IsLetterOrDigit(_keypress) && !char.IsPunctuation(_keypress);
}
}