c# – 检测KeyUp事件中的密钥

我在表单上有一个文本框,我正在尝试检测用户键入的键.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.

上一篇:javascript – 如何在用户点击它时消失的文本字段中显示灰色文本


下一篇:c# – UWP TextBox.Text绑定在使用PlaceholderText时不更新