如何使TextBox上的Enter作为TAB按钮

时间:2008-12-16 13:41:40

标签: c# .net winforms

我有几个文本框。我想让Enter按钮充当Tab。因此,当我将在一个文本框中时,按Enter将使我移动到下一个文本框。您能告诉我如何实现这种方法而不在textbox类中添加任何代码(如果可能的话,没有覆盖等等)?

12 个答案:

答案 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的解决方案

  1. 在表单属性中设置 Keypreview = True

  2. 将此代码放在表单keydown事件中:

    if(e.KeyData = Keys.Enter)然后

    '对于任何多行控件,你必须退出以让多行'textbox intro'按键使行跳过。

    f

    结束如果

  3. 享受!!!!

    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