我在表单上有一个文本框,我正在尝试检测用户键入的键.TextBox是多行的,带有wordwrap.我不希望用户按下回车键(因为我希望所有文本都在一行输入,包装)所以我使用了以下代码:
private void txtPlain_KeyPress(object sender, KeyPressEventArgs e) {
if (e.KeyChar == (char)13) {
MessageBox.Show("Enter keys are not allowed");
e.KeyChar = (char)0;
}
}
这在我的测试中运行良好,但是当我测试CTRL ENTER时它没有工作,因为我不知道如何检测控制键.从我的谷歌搜索我发现我需要使用KeyUp / Down事件,所以我现在有以下代码:
private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
//if (e.KeyData == (Keys.Control | Keys.Enter)) {
if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {
MessageBox.Show("Enter keys are not allowed:");
//e.KeyValue = Keys.None;
}
}
第一个注释掉的行由于某种原因没有用,所以如果有人能解释为什么这会有用.
KeyUp / Down事件的问题在于我不知道如何从文本中删除回车键 – 与KeyPress事件不同,我可以将KeyChar设置为零.该事件捕获Enter和Ctrl Enter键,但光标仍然转到TextBox中的下一行.
感谢您的帮助.
解决方法:
嗯,没有理由通过处理KeyDown或KeyUp事件来禁止Enter键.您只需将文本框控件的AcceptsReturn
property设置为False即可.这将阻止多行文本框响应按Enter键.
当然,这并不能解决Ctrl Enter的问题.实际上,当AcceptsReturn属性设置为False时,这是创建新行的预期方法.要解决此问题,您需要处理其中一个键盘事件并阻止控件接收此输入.
KeyDown是一个很好的起点.你想要做的是过滤掉任何包含Keys.Enter标志的键盘事件.无论它们与哪个其他修饰键组合在一起,它都会捕获它们.然后,一旦找到Enter按键,就要将e.Handled属性设置为True,以防止它被传递给控件.
但不幸的是,我们还没有完成.文本框控件尝试在内部处理某些键,并且您无法在键事件处理程序方法中覆盖它.您还需要告诉控件不要将该特定键解释为输入键.有两种主要方法可以做到这一点.第一种(也是推荐的方法)是从基础TextBox类继承来创建自己的自定义控件,然后覆盖受保护的IsInputKey
method.第二种(稍微简单)方法就是处理PreviewKeyDown
event,并将IsInputKey属性设置为False .
示例代码:
private void txtPlain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
// Check if the KeyCode value has the Keys.Enter flag set
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
// Set the IsInputKey property to False
e.IsInputKey = false;
}
}
private void txtPlain_KeyDown(object sender, KeyEventArgs e)
{
// Check if the KeyCode value has the Keys.Enter flag set
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
// Show the user a message
MessageBox.Show("Enter keys are not allowed in this textbox.");
// Prevent the key event from being passed on to the control
e.Handled = true;
}
}
而且,虽然我认为这仅用于测试目的,但您肯定希望从那里获取生产代码的MessageBox调用.找到另一种提醒用户不允许输入的方法,例如短蜂鸣声和文本框旁边的ErrorProvider
component.显示消息框非常刺耳,并且不是非常用户友好.有关其他提示和技巧,请参阅my answer here.