我有几个文本框。我想让Enter按钮充当Tab。因此,当我将在一个文本框中时,按Enter将使我移动到下一个文本框。您能告诉我如何实现这种方法而不在textbox类中添加任何代码(如果可能的话,没有覆盖等等)?
答案 0 :(得分:20)
这是我经常使用的代码。 它必须是KeyDown事件。
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
<强>更新强>
其他方式是发送“TAB”键!覆盖方法使它变得如此简单:)
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Enter))
{
SendKeys.Send("{TAB}");
}
return base.ProcessCmdKey(ref msg, keyData);
}
答案 1 :(得分:11)
您可以在任何控件的 keyDown 上书写:
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
GetNextControl不适用于Vista。
要使其与Vista一起使用,您需要使用以下代码替换this.GetNextControl ...:
System.Windows.Forms.SendKeys.Send("{TAB}");
答案 2 :(得分:4)
您无需制作“输入事件处理程序”
您需要做的就是制作一个“中心”KeyDown事件:
例如
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();
}
}
}
然后你要做的就是去设计师选择你想用EnterKey循环的所有文本框(通过按住Ctrl并用鼠标点击文本框来选择它们)然后转到事件(雷声像按钮),搜索Keydown在General_KeyDown中的事件和类型。现在你所选择的所有文本框都将具有相同的keydown事件:)这使得一切都变得更容易,因为想象一个包含100个文本框的表单,并且你想要使用enter循环所有....为每个texbox制作一个分开的事件是...好吧,不是一个制作节目的正确方法,它并不整洁。希望它有所帮助!!
块引用
答案 3 :(得分:3)
重要的是要注意,如果每次控件期望相关的按钮控制时你会得到恼人的“叮当”或警告声,而e.Handled = true
并不总是能够摆脱噪音的答案/声音/丁
如果控件(即单行文本框)期望相关按钮“输入”您的条目,那么您还必须处理“缺失”控件。
e.Handled = e.SuppressKeyPress = true;
当摆脱'叮当'的声音时,这可能会有所帮助。
在我的情况下,我的用户需要使用“ENTER KEY”,因为我们正在从终端/绿屏应用程序转换到Windows应用程序,他们更习惯通过字段“输入”而不是标签。
所有这些方法都有效,但在我添加e.SuppressKeyPress
之前仍保持恼人的声音。
答案 4 :(得分:1)
这对我有用
if (e.Key == Key.Enter)
((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
答案 5 :(得分:1)
如果您定义所有控件的Tab Order并使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
答案 6 :(得分:0)
对于那些用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
答案 7 :(得分:0)
我在其中一个文本框keydown事件中使用此代码
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
无法处理表单中所有文本框的keydown
事件。建议一些事情。感谢
答案 8 :(得分:0)
这是我用于VB.NET的解决方案
在表单属性中设置 Keypreview = True 。
将此代码放在表单keydown事件中:
if(e.KeyData = Keys.Enter)然后
'对于任何多行控件,你必须退出以让多行'textbox intro'按键使行跳过。
f
结束如果
享受!!!!
Xabier Aberasturi Larruzea
答案 9 :(得分:0)
我不在表单级别执行此操作。我创建了一个我要在所有输入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 lastinput_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("{TAB}");
}
}
catch
{
}
}
否则,当您尝试在另一个项目中运行该控件时,该控件只会在其内部循环。您可以在任何地方使用第二种方法,但我认为第一种是首选方法。
答案 10 :(得分:-1)
疯狂猜测:
// on enter event handler
parentForm.GetNextControl().Focus();
答案 11 :(得分:-1)
我会把Pharabus和arul的回答结合起来:
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ‘\r’)
{
e.Handled = true;
parentForm.GetNextControl().Focus()
}
}
如果这有帮助,请告诉我! JFV