C# 如何使文本框上的Enter键充当选项卡按钮
我有几个文本框。我想让“回车”按钮充当选项卡。这样,当我在一个文本框中时,按Enter键会将我移动到下一个文本框。如果可能的话,您能告诉我如何在不在textbox类中添加任何代码的情况下实现此方法吗?胡乱猜测:C# 如何使文本框上的Enter键充当选项卡按钮,c#,.net,winforms,C#,.net,Winforms,我有几个文本框。我想让“回车”按钮充当选项卡。这样,当我在一个文本框中时,按Enter键会将我移动到下一个文本框。如果可能的话,您能告诉我如何在不在textbox类中添加任何代码的情况下实现此方法吗?胡乱猜测: // on enter event handler parentForm.GetNextControl().Focus(); 我会把法拉布斯和阿鲁尔的回答结合起来: private void textBox_KeyPress(object sender, KeyPressEventAr
// on enter event handler
parentForm.GetNextControl().Focus();
我会把法拉布斯和阿鲁尔的回答结合起来:
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ‘\r’)
{
e.Handled = true;
parentForm.GetNextControl().Focus()
}
}
private void lastinput_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("{TAB}");
}
}
catch
{
}
}
让我知道这是否有帮助!JFV您可以在任何控件的向下键上写入:
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
GetNextControl在上不起作用
要使其与Vista配合使用,您需要使用下面的代码替换this.GetNextControl…:
System.Windows.Forms.SendKeys.Send("{TAB}");
您不需要创建enter事件处理程序 您只需创建一个中央按键事件: 范例
private void General_KeyDown(object sender, KeyPressEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
}
然后,您所要做的就是进入designer,用Enter键选择所有要循环使用的文本框按住Ctrl键并用鼠标单击文本框,选择它们,然后进入Eventsthunder-like按钮,搜索Keydown事件并在General_Keydown内键入。现在,您选择的所有文本框都将具有相同的键控事件:这使一切变得更加简单,因为想象一个包含100个文本框的表单,并且您希望使用enter循环所有文本框。。。。为每个texbox制作一个单独的事件是。。。这不是制作程序的正确方法,它不整洁。希望有帮助
大宗报价
对于那些用vb编写代码的人
Public Class NoReturnTextBox
Inherits System.Windows.Forms.TextBox
Const CARRIAGE_RETURN As Char = Chr(13)
' Trap for return key....
Private Sub NoReturnTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = CARRIAGE_RETURN Then
e.Handled = True
System.Windows.Forms.SendKeys.Send(vbTab)
End If
End Sub
End Class
这对我有用
if (e.Key == Key.Enter)
((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
下面是我通常使用的代码。 它必须在按键关闭事件上
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
更新
另一种方法是发送制表键!并且重写该方法使其更容易:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Enter))
{
SendKeys.Send("{TAB}");
}
return base.ProcessCmdKey(ref msg, keyData);
}
如果定义所有控件的选项卡顺序并使Form.KeyPreview=True,则只需此项:
Private Sub frmStart_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Enter Then
System.Windows.Forms.SendKeys.Send("{TAB}")
End If
End Sub
重要的是要注意,如果每次控件需要关联的按钮控件时,您都会听到恼人的叮当声或警告声,那么e.Handled=true并不总是摆脱噪音/声音/叮当声的答案 如果控件(即单行文本框)希望相关按钮“输入”您的输入,则您还必须处理“缺少”控件
e.Handled = e.SuppressKeyPress = true;
这可能有助于消除“叮当”声
值得一提的是,在我的情况下,当我们从终端/绿色屏幕应用程序过渡到windows应用程序时,我的用户需要使用ENTER键,他们更习惯于通过字段而不是选项卡输入
所有这些方法都有效,但在我添加e.SuppressKeyPress之前,仍然保持着恼人的声音。我在一个文本框keydown事件中使用了此代码
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
无法为我的表单中的所有文本框处理此keydown事件。提出建议。谢谢这是我用于VB.NET的解决方案 在表单属性中设置Keypreview=True 将此代码放入表单keydown事件中: 如果e.KeyData=Keys,则输入 '对于任何多行控件,必须退出才能让多行'textbox intro'按键使行跳过
If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub
e.SuppressKeyPress = True
SelectNextControl(ActiveControl, True, True, True, True)
如果结束
享受吧
哈比尔·阿伯拉斯图里·拉鲁泽亚(Xabier Aberasturi Larruzea)我不是在形式层面上这样做的。我创建了一个方法,在我所有的输入KeyDown事件中共享该方法,但有一个例外:
private void alltextBoxes_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
}
catch
{
}
}
如果我正在编写一个我想在其他应用程序中使用的控件,我会为最后一个输入提供自己的方法,如下所示:
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ‘\r’)
{
e.Handled = true;
parentForm.GetNextControl().Focus()
}
}
private void lastinput_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("{TAB}");
}
}
catch
{
}
}
否则,当您尝试在另一个项目中运行控件时,该控件只是在其内部循环。您可以在任何地方使用第二种方式,但我认为第一种是首选方式。这是web还是win forms应用程序?我发现这让我感觉有点不舒服:听起来有点不舒服,但这对我来说很有效。GetNextControl不考虑窗体上的某些控件可能不可见或被禁用。我试过做这样的事,但没那么容易。所以我将使用这个解决方案。谢谢你,法拉布斯!我也对这个问题表示怀疑。谢谢你的提问……是的,但是你不需要把它放到文本框中。而是将其强制转换为UIElement,然后可以在每个控件上使用此方法。您还应该提到,这仅在WPF中可用,而在Winforms中不可用。@Oliver:+1提到它仅在WPF中可用,而不适用于Winforms。+1我认为SelectNextControl比GetNextControl更好,因为这将自动跳过标签、面板、GroupBox、PictureBox、进度条、拆分器和链接标签。更多信息+1,因为SelectNextControl使Enter键在这里的行为更像Tab键,因为如果第三个参数设置为true,它也将跳过TabStop设置为false的控件。这个答案非常接近,它包含了您需要的所有代码,但分为两个代码段。您想调用SelectNextControl而不是SendKeys.Send{TAB}在ProcessCmdKey覆盖中。此外,ProcessCmdKey在这种情况下应该返回true,因此它不会继续处理enter键。另外,您需要设置KeyPreview=true才能调用ProcessCmdKey
此.Controls中的dows.Forms.Control cont{如果cont是文本框{cont.KeyDown+=new KeyEventHandlerthis.txtNo_KeyDown;}GetNextControl在Windows 10中也不起作用。请使用SendKeys.Send{TAB}。