.NET 文本框 - 处理回车键

56
什么是根据用户在 .NET TextBox 中输入的 Enter 键 (Keys.Enter) 执行操作的最佳方式,假设该键输入归属于将 Enter 键抑制到 TextBox 自身的所有者 (e.Handled = true)?
假设本问题的目标行为不是按下表单的默认按钮,而是执行其他一些自定义处理。

1
我不明白这个问题。你是在问要执行什么操作,还是在问如何执行它,或者是在问如何在事件发生时得到通知? - ChrisW
2
最好的方法是什么都不做。在UI设计中,回车键有一个明确定义的含义,不应该被篡改。在一个表单中任意使用它来改变焦点,在另一个对话框中使用AcceptButton只会让用户感到困惑。 - Hans Passant
1
ChrisW:基础知识都很明显。我在这里想知道如何处理与天真实现相关的警告,例如,如果您绑定了数据到Text属性,那么当您处理KeyDown事件时,数据源还没有更新为文本框中存储的值。@Hans Passant:我明白你的意思。在这种情况下,它用于全文搜索框的上下文中,该框与可选(很少使用)的其他输入配对。按Enter键应执行搜索。 - Mark Allanson
5个回答

83

添加一个键盘按键事件,捕获回车键。

程序上看起来像这样:

//add the handler to the textbox
this.textBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(CheckEnterKeyPress);

然后在代码中添加一个处理程序...

private void CheckEnterKeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
        if (e.KeyChar == (char)Keys.Return)

        {
           // Then Do your Thang
        }
}

1
这里不需要转换。此外,当在文本框上进行数据绑定时,由于数据源尚未在KeyDown和Keys.Return捕获的时候更新,因此这无法正常工作。 - Mark Allanson
谢谢。你说的冗余转换是对的。至于数据绑定的问题,你能在数据绑定完成后添加keypress事件吗?或者你可以使用try/catch来捕获异常,对吧? - It Grunt
14
现在看起来这个演员阵容并不多余,没有它就无法编译。 - Asherah

27

为了将函数与文本框的按键事件链接起来,请在窗体的designer.cs中添加以下代码:

 this.textbox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDownHandler);

现在在同一窗体的 cs 文件中定义函数 'OnKeyDownHandler':

private void OnKeyDownHandler(object sender, KeyEventArgs e)
{

    if (e.KeyCode == Keys.Enter)
    {
       //enter key has been pressed
       // add your code
    }

}

8
您可以将此代码放入FormLoad事件中:
textBox1.KeyPress += (sndr, ev) => 
{
    if (ev.KeyChar.Equals((char)13))
    {
        // call your method for action on enter
        ev.Handled = true; // suppress default handling
    }
};

1
这不会抑制默认处理。 - SLaks
你只需要添加 ev.Handled = true; 即可。已更新帖子。 - Nate
1
不是检查回车键的最佳方式。 - Mark Allanson
2
那么什么是最好的方法呢? - Nate

3

如果您希望在程序执行时某个按钮能够处理回车键,只需将窗体的AcceptButton属性指向该按钮即可。

例如:this.AcceptButton = StartBtn;


这假设你有一个按钮。 - undefined

2

像这样设置KeyPress事件:

this.tMRPpart.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tMRPpart_KeyPress);

然后您可以执行操作,包括在事件中检测“enter”键-
private void tMRPpart_KeyPress(object sender, KeyPressEventArgs e)
{
    // force any lower case characters into capitals
    if (e.KeyChar >= 'a' && e.KeyChar <= 'z')
        e.KeyChar -= (char)32;

    // If user presses return, tab to next tab stop
    if (e.KeyChar == (char)Keys.Return)
    {
        if (sender is Control)
        {
            // Move to next control
            SelectNextControl((Control)sender, true, true, true, true);
        }
    }
}

在我的情况下,如果用户按下回车键,我希望应用程序能够切换到下一个字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接