![](/img/trans.png)
[英]How can I fire a Button Click event when Enter Key is pressed based on what textbox has focus?
[英]C# How do I click a button by hitting Enter whilst textbox has focus?
我正在使用 C# 中的 WinForm 应用程序,在我在文本框中输入内容后,我想按 Enter 键但文本框仍然有焦点(闪烁 cursor 仍在文本框中),我该如何实现?
简单的选项就是将表单的AcceptButton设置为您想要按下的按钮(通常为“OK”等):
TextBox tb = new TextBox();
Button btn = new Button { Dock = DockStyle.Bottom };
btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
Application.Run(new Form { AcceptButton = btn, Controls = { tb, btn } });
如果这不是一个选项,你可以查看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 } });
通常的方法是将Form
的AcceptButton
设置为您想要“单击”的按钮。 您可以在VS设计器或代码中执行此操作,并且可以随时更改AcceptButton
。
这可能适用于您的情况,也可能不适用,但我已将此与GotFocus
事件结合使用,用于表单上的不同TextBox
,以根据用户点击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
调用的控件。
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事件绑定到文本框,然后当您按下某个键时,将触发此事件。 在活动内部,我们检查用户是否按下了“输入密钥”,如果是,您可以执行操作
我自己也在寻找相同的东西,但我注意到当你不想在输入时点击表格上的'AcceptButton'时,所列出的答案都没有提供解决方案。
一个简单的用例是屏幕上的文本搜索框,按下Enter键应“单击”“搜索”按钮,而不是执行Form的AcceptButton行为。
这个小片段可以解决问题;
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
if (!textBox.AcceptsReturn)
{
button1.PerformClick();
}
}
}
在我的例子中,此代码是从TextBox派生的自定义UserControl的一部分,并且该控件具有“ClickThisButtonOnEnter”属性。 但以上是一个更通用的解决方案。
只需将“ 接受按钮 ”属性设置为您想要按Enter键的按钮。 或者在load事件中写this.acceptbutton = btnName;
最初学友友善的解决方案是:
在Designer中,单击要发生此操作的文本字段。 在属性窗口(默认:右下角)单击thunderbolt(事件)。 此图标位于字母排序图标和属性图标旁边。
向下滚动到keyDown
。 单击右侧的下拉字段。 你会注意到那里什么也没有,所以只需按回车即可。 Visual Studio将为您编写以下代码:
private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e) { }
然后只需将其粘贴在括号中:
if (e.KeyCode == Keys.Enter) { yourNameOfButton.PerformClick(); }
这将按照你点击它的方式行事。
在Visual Studio 2017中,使用c#,只需在您的按钮中添加AcceptButton属性,在我的示例中为“btnLogIn”:
this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;
将其添加到Form的构造函数中:
this.textboxName.KeyDown += (sender, args) => {
if (args.KeyCode == Keys.Return)
{
buttonName.PerformClick();
}
};
或者你可以使用这个简单的2班码:)
if (e.KeyCode == Keys.Enter)
button1.PerformClick();
这对WinForms非常有效。 但是,在WPF中,你需要以不同的方式做事,而且更容易。 将与此文本区域相关的Button的IsDefault属性设置为true。
完成捕获回车键后,不要忘记相应地切换属性。
在我的情况下,TextBox根本没有收到回车键。 我尝试的第一件事是将输入键更改为输入键,但是当按下输入时我仍然发出系统蜂鸣声。 因此,我将ProcessDialogKey()方法子类化并覆盖,并发送了我自己的事件,我可以将点击处理程序绑定到。
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);
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
button1_Click(textBox1.Focus(),e);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.