C#如何在文本框有焦点的情况下通过按Enter键单击按钮?

C#如何在文本框有焦点的情况下通过按Enter键单击按钮?,c#,winforms,C#,Winforms,我正在使用C#中的WinForm应用程序,在文本框中键入内容后,我想按Enter键,但文本框仍有焦点(闪烁的光标仍在文本框中),如何实现这一点?简单的选项是将表单的AcceptButton设置为您想要按下的按钮(通常为“OK”等): 如果这不是一个选项,您可以查看KeyDown事件等,但这是更多的工作 TextBox tb = new TextBox(); Button btn = new Button { Dock = DockStyle.Bottom }; btn.C

我正在使用C#中的WinForm应用程序,在文本框中键入内容后,我想按Enter键,但文本框仍有焦点(闪烁的光标仍在文本框中),如何实现这一点?

简单的选项是将表单的AcceptButton设置为您想要按下的按钮(通常为“OK”等):

如果这不是一个选项,您可以查看KeyDown事件等,但这是更多的工作

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    tb.KeyDown += (sender,args) => {
        if (args.KeyCode == Keys.Return)
        {
            btn.PerformClick();
        }
    };
    Application.Run(new Form { Controls = { tb, btn } });

通常的方法是将
表单
接受按钮
设置为要“单击”的按钮。您可以在VS设计器或代码中执行此操作,并且可以随时更改
AcceptButton

这可能适用于您的情况,也可能不适用于您的情况,但我已将其与表单上不同的
TextBox
es的
gotfource
事件结合使用,以根据用户按Enter键的位置启用不同的行为。例如:

void TextBox1_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox1;
}

void TextBox2_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox2;
}

使用此方法时需要注意的一点是,当
TextBox3
成为焦点时,不要将
AcceptButton
设置为
ProcessTextBox1
。我建议在设置
AcceptButton
TextBox
上使用
LostFocus
事件,或者创建一个
GotFocus
方法,所有不使用特定
AcceptButton
调用的控件都可以使用该方法。

您可以在keyup事件中将其捕获。

这对WinForms非常有效。然而,在WPF中,您需要以不同的方式进行操作,而且更容易。 将与此文本区域相关的按钮的IsDefault属性设置为true


捕捉完enter键后,请不要忘记相应地切换属性。

我自己在寻找相同的内容时遇到了这个问题,我注意到,当您不想在按下enter键时单击表单上的“AcceptButton”时,列出的答案实际上都无法提供解决方案

一个简单的用例是屏幕上的文本搜索框,按enter键应该“单击”搜索按钮,而不是执行表单的AcceptButton行为

这个小片段就可以了

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if (!textBox.AcceptsReturn)
        {
            button1.PerformClick();
        }
    }
}
在我的例子中,此代码是从TextBox派生的自定义UserControl的一部分,该控件具有“ClickThisButtonOnCenter”属性。但以上是一个更普遍的解决方案

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Enter)
     {
         button.PerformClick();
         // these last two lines will stop the beep sound
         e.SuppressKeyPress = true;
         e.Handled = true;
     }
}

将此KeyDown事件绑定到文本框,然后每次按下一个键时,都会触发此事件。在事件内部,我们检查用户是否按下了“回车键”,如果是,您可以执行您的操作

最适合初学者的解决方案是:

  • 在Designer中,单击要执行此操作的文本字段。 在属性窗口(默认:右下角)单击thunderbolt(事件)。此图标位于字母排序图标和属性图标旁边

  • 向下滚动至
    keyDown
    。单击其右侧的下拉字段。你会注意到里面什么都没有,所以只需按回车键。Visual Studio将为您编写以下代码:

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  • 然后简单地将其粘贴在括号之间:

    if (e.KeyCode == Keys.Enter)
    {
         yourNameOfButton.PerformClick();
    }
    
  • 这将如同您单击它一样。

    只需将form“Accept Button”属性设置为要按Enter键点击的按钮。
    或在加载事件中写入
    this.acceptbutton=btnName

    将其添加到表单的构造函数:

    this.textboxName.KeyDown += (sender, args) => {
        if (args.KeyCode == Keys.Return)
        {
            buttonName.PerformClick();
        }
    };
    

    或者,您可以使用以下简单的2行代码:)


    在Visual Studio 2017中,使用c#,只需将AcceptButton属性添加到按钮,在我的示例“btnLogIn”中:


    在我的情况下,文本框根本没有收到回车键。我尝试的第一件事是将回车键改为输入键,但按下回车键时,我仍然听到系统的嘟嘟声。因此,我对ProcessDialogKey()方法进行了子类化和重写,并发送了我自己的事件,我可以将click处理程序绑定到该事件

    public class EnterTextBox : TextBox
    {
        [Browsable(true), EditorBrowsable]
        public event EventHandler EnterKeyPressed;
    
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EnterKeyPressed?.Invoke(this, EventArgs.Empty);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    }
    

    此外,您可以将
    e.Handled
    设置为
    true
    以避免蜂鸣音。哇,干净简单,我喜欢!你能补充一些解释吗?我更喜欢这个答案,它是迄今为止最简单的。为什么不使用“接受”按钮呢?这对我来说是一个完美的解决方案。谢谢
    if (e.KeyCode == Keys.Enter)
                button1.PerformClick();
    
    this.btnLogIn = new System.Windows.Forms.Button();
    //....other settings
    this.AcceptButton = this.btnLogIn;
    
    public class EnterTextBox : TextBox
    {
        [Browsable(true), EditorBrowsable]
        public event EventHandler EnterKeyPressed;
    
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                EnterKeyPressed?.Invoke(this, EventArgs.Empty);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
    }