C#如何在文本框有焦点的情况下通过按Enter键单击按钮?
我正在使用C#中的WinForm应用程序,在文本框中键入内容后,我想按Enter键,但文本框仍有焦点(闪烁的光标仍在文本框中),如何实现这一点?简单的选项是将表单的AcceptButton设置为您想要按下的按钮(通常为“OK”等): 如果这不是一个选项,您可以查看KeyDown事件等,但这是更多的工作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
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事件绑定到文本框,然后每次按下一个键时,都会触发此事件。在事件内部,我们检查用户是否按下了“回车键”,如果是,您可以执行您的操作最适合初学者的解决方案是:
keyDown
。单击其右侧的下拉字段。你会注意到里面什么都没有,所以只需按回车键。Visual Studio将为您编写以下代码:
private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
{
}
if (e.KeyCode == Keys.Enter)
{
yourNameOfButton.PerformClick();
}
或在加载事件中写入
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);
}
}