繁体   English   中英

如何使 TextBox 上的 Enter 充当 TAB 按钮

[英]How to make Enter on a TextBox act as TAB button

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

这是我经常使用的代码。 它必须是KeyDown事件。

if (e.KeyData == Keys.Enter)
{
    e.SuppressKeyPress = true;
    SelectNextControl(ActiveControl, true, true, true, true);
}

UPDATE

其他方式是发送“TAB”键! 并覆盖该方法使它更容易:)

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{            
    if (keyData == (Keys.Enter))
    {
        SendKeys.Send("{TAB}");
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

你可以写任何控件的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}");

您不需要创建“输入事件处理程序”

您需要做的就是制作一个“中心”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制作一个分开的事件是...好吧,不是一个制作节目的正确方法,它并不整洁。 希望它有所帮助!!

大段引用

重要的是要注意,如果每次控件期望相关的按钮控制并且e.Handled = true时,你会得到恼人的“叮”声或警告声并不总是能够摆脱噪音/声音的答案/丁。

如果控件(即单行文本框)期望相关按钮“输入”您的条目,那么您还必须处理“缺失”控件。

e.Handled = e.SuppressKeyPress = true;

当摆脱“叮”声时,这可能会有所帮助。

在我的情况下,我的用户需要使用“ENTER KEY”,因为我们正在从终端/绿屏应用程序转换到Windows应用程序,他们更习惯于通过字段而不是标签来“输入” 。

所有这些方法都有效,但在我添加e.SuppressKeyPress之前仍然保持令人讨厌的声音。

如果您定义所有控件的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

这对我有用

if (e.Key == Key.Enter)
            ((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));

对于那些在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

我在其中一个文本框keydown事件中使用此代码

if (e.KeyData == Keys.Enter)
{
     e.SuppressKeyPress = true;
     SelectNextControl(ActiveControl, true, true, true, true);
}

无法处理表单中所有文本框的keydown事件。 建议一些事情。 谢谢

这是我用于VB.NET的解决方案

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

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

    如果(e.KeyData = Keys.Enter)那么

    '对于任何多行控件,你必须退出让多行'文本框介绍'按键才能使行跳过。

      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 lastinput_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }
        catch
        {
        }
    }

否则,当您尝试在另一个项目中运行它时,控件只会在其自身内部循环。 你可以在任何地方使用第二种方式,但我认为第一种方式是首选方式。

这个更好

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Enter))
            {
                SelectNextControl(ActiveControl, true, true, true, true);
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

猜测一下:

// on enter event handler
parentForm.GetNextControl().Focus();

我会把Pharabus和arul的回答结合起来:

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ‘\r’)
{
e.Handled = true;
parentForm.GetNextControl().Focus()
}
}

如果这有帮助,请告诉我! JFV

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM