C# 如何使文本框上的Enter键充当选项卡按钮

C# 如何使文本框上的Enter键充当选项卡按钮,c#,.net,winforms,C#,.net,Winforms,我有几个文本框。我想让“回车”按钮充当选项卡。这样,当我在一个文本框中时,按Enter键会将我移动到下一个文本框。如果可能的话,您能告诉我如何在不在textbox类中添加任何代码的情况下实现此方法吗?胡乱猜测: // on enter event handler parentForm.GetNextControl().Focus(); 我会把法拉布斯和阿鲁尔的回答结合起来: private void textBox_KeyPress(object sender, KeyPressEventAr

我有几个文本框。我想让“回车”按钮充当选项卡。这样,当我在一个文本框中时,按Enter键会将我移动到下一个文本框。如果可能的话,您能告诉我如何在不在textbox类中添加任何代码的情况下实现此方法吗?

胡乱猜测:

// 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}。