我使用以下文本框keypress()事件来捕获用户输入的击键,以限制用户输入字母和数值。
private void textBoxName_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !(char.IsLetter(e.KeyChar) ||
e.KeyChar == (char)Keys.Space ||
e.KeyChar == (char)Keys.Back ||
e.KeyChar==(char)Keys.ControlKey );
}
现在问题是使用上面提到的代码我即使在keypress事件中处理了keys.ControlKey,也无法使用Ctrl + C或Ctrl + v等快捷键。
我在这里做错了什么?
提前致谢。
答案 0 :(得分:1)
如果在没有任何其他键的情况下按下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);
}
}