我在表单上有一个文本框,我正在尝试检测用户键入的键.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中的下一行。
感谢您提供任何帮助。
答案 0 :(得分:5)
嗯,没有理由通过处理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。
答案 1 :(得分:1)
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;
// mark event as handled
e.Handled = true;
}
}
来自msdn link
修改强>
我认为您需要按键事件而不是按键
<强> EDIT2 强>
这里有一些经过测试的代码,它可以按你的需要工作:
bool invalid=false;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode & Keys.Enter) == Keys.Enter)
{
invalid = true;
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (invalid)
{
e.Handled = true;
}
invalid = false;
}
答案 2 :(得分:0)
由于某种原因,第一条注释掉的行没有起作用,所以如果有人能解释为什么这会有用。
您想要检测Ctrl + Enter。 if(e.KeyData ==(Keys.Control | Keys.Enter)){..
Keys.Control和Key.Enter只是一些值please refer。现在做逻辑或不一定会导致按下的键。完全不合逻辑的条款。
好了,现在来看你想要检测的实际问题输入笔划和Ctrl +输入笔划被视为相同。 此外,您想要撤消已引入的换行符。试试
具有以下条件的PreviewKeyDown或Preview key up eventhandler
如果(e.KeyCode == Keys.Enter)
让我知道这是否有效