按Enter键移至下一个控件

时间:2009-07-06 16:00:58

标签: c# winforms

我在WinForm上有几个TextBox。当按下Enter键时,我希望焦点移动到下一个控件?每当文本框获得控制权时,它也会选择文本,以便任何编辑都将替换当前文本。

这样做的最佳方式是什么?

8 个答案:

答案 0 :(得分:28)

Tab键作为Enter:创建一个继承文本框的用户控件,覆盖KeyPress方法。如果用户按Enter键,您可以拨打SendKeys.Send("{TAB}")System.Windows.Forms.Control.SelectNextControl()。请注意,您可以使用KeyPress事件实现相同的目标。

焦点整篇文章:再次,通过覆盖或事件,定位GotFocus事件,然后调用TextBox.Select方法。

答案 1 :(得分:23)

C#中使用 SelectNextControl

的几个代码示例

当按下 ENTER 时,第一个移动到下一个控件。

    private void Control_KeyUp( object sender, KeyEventArgs e )
    {
        if( (e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return) )
        {
            this.SelectNextControl( (Control)sender, true, true, true, true );
        }
    }

第二个使用 UP DOWN 箭头来移动控件。

    private void Control_KeyUp( object sender, KeyEventArgs e )
    {
        if( e.KeyCode == Keys.Up )
        {
            this.SelectNextControl( (Control)sender, false, true, true, true );
        }
        else if( e.KeyCode == Keys.Down )
        {
            this.SelectNextControl( (Control)sender, true, true, true, true );
        }
    }

请参阅MSDN SelectNextControl Method

答案 2 :(得分:11)

在KeyPress事件中,如果用户按Enter键,请调用

SendKeys.Send("{TAB}")

实现在接收焦点时自动选择文本的最好方法是在项目中使用以下覆盖创建TextBox的子类:

Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
    SelectionStart = 0
    SelectionLength = Text.Length
    MyBase.OnGotFocus(e)
End Sub

然后使用此自定义TextBox代替所有表单上的WinForms标准TextBox。

答案 3 :(得分:2)

您可以在TextBox上放置KeyPress处理程序,并查看使用了哪个键。

要处理文本选择,请在GotFocus事件上添加处理程序。

您可能还想考虑如何(或者如果需要)处理多行文本框。

答案 4 :(得分:2)

这可能有所帮助:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    //
    // Detect the KeyEventArg's key enumerated constant.
    //
    if (e.KeyCode == Keys.Enter)
    {
        MessageBox.Show("You pressed enter! Good job!");
    }
}

答案 5 :(得分:0)

如果您想更频繁地使用它,您也可以为此编写自己的控件。 假设您在Grid中有多个TextBox,它看起来像这样:

public class AdvanceOnEnterTextBox : UserControl
{

    TextBox _TextBox;
    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null);
    public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null);


    public AdvanceOnEnterTextBox()
    {
        _TextBox = new TextBox();
        _TextBox.KeyDown += customKeyDown;
        Content = _TextBox;

    }


    /// <summary>
    /// Text for the TextBox
    /// </summary>
    public String Text
    {
        get { return _TextBox.Text; }
        set { _TextBox.Text = value; }
    }


    /// <summary>
    /// Inputscope for the Custom Textbox
    /// </summary>
    public InputScope InputScope
    {
        get { return _TextBox.InputScope; }
        set { _TextBox.InputScope = value; }
    }


    void customKeyDown(object sender, KeyEventArgs e)
    {
        if (!e.Key.Equals(Key.Enter)) return;

        var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox;
        if (element != null)
        {
            int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element);
            try
            {
                // Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween).
                ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus();
            }
            catch (Exception)
            {
                // Close Keypad if this was the last AdvanceOnEnterTextBox
                ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false;
                ((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true;
            }
        }
    }
}

答案 6 :(得分:0)

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

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

转到设计表单和View->选项卡(如图片所示),然后订购所有控件[就是这样] enter image description here

答案 7 :(得分:-1)

尝试使用:

SendKeys.Send("{TAB}")