Tom Smykowski
Tom Smykowski

Reputation: 26089

How to make Enter on a TextBox act as TAB button

I've several textboxes. I would like to make the Enter button act as Tab. So that when I will be in one textbox, pressing Enter will move me to the next one. Could you please tell me how to implement this approach without adding any code inside textbox class (no override and so on if possible)?

Upvotes: 23

Views: 75442

Answers (13)

Ezra Edwin
Ezra Edwin

Reputation: 3

This is better because when enter u can do focus the next tab.. U need setting TAB Order first

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);
        }

Upvotes: 0

glctig
glctig

Reputation: 31

I don't do it at the form level. I create a single method that I share across all my inputs KeyDown event that I want to do this with (with one exception):

       private void alltextBoxes_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                SelectNextControl(ActiveControl, true, true, true, true);                    
            }
        }
        catch
        {
        }
    }

If I'm writing a control that I want to use in other applications, I give the last input its own method like this:

       private void lastinput_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.SuppressKeyPress = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }
        catch
        {
        }
    }

Otherwise, the control just loops inside itself when you try to run it in another project. You could use the second way everywhere but I think the 1st is the preferred way.

Upvotes: 1

Xabier Aberasturi
Xabier Aberasturi

Reputation: 31

This is the solution I use for VB.NET

  1. Set Keypreview=True in your form properties.

  2. Put this code in form keydown event:

    If (e.KeyData = Keys.Enter) Then

    'for any multiline control, you have to exit to let multiline 'textbox intro 'keypressing makes line skips.

     If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub 
    
     e.SuppressKeyPress = True
     SelectNextControl(ActiveControl, True, True, True, True)
    

    End If

Enjoy !!!!

Xabier Aberasturi Larruzea

Upvotes: 1

Behzad
Behzad

Reputation: 2190

Here is the code that I usually use. It must be on KeyDown event.

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

UPDATE

Other way is sending "TAB" key! And overriding the method make it so easier :)

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

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

Upvotes: 28

Shahrzad Saeedi
Shahrzad Saeedi

Reputation: 11

I use this code in one of the text box keydown event

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

Unable handle this keydown event for all text boxes in my form. Suggest something. Thanks

Upvotes: 1

Greg
Greg

Reputation: 313

It is important to note that if you will get an annoying "ding" or warning sound each time that the control is expecting an associated button control and e.Handled = true isn't always the answer to rid yourself of the noise/sound/ding.

If the control (i.e. single-line textbox) is expecting an associated button to 'ENTER' your entry, then you must also deal with the 'missing' control.

e.Handled = e.SuppressKeyPress = true;

This may be helpful when getting rid of the 'ding' sound.

For what it's worth- in my circumstance my users needed to use the "ENTER KEY" as we were transitioning from a terminal/green-screen application to a windows app and they were more used to "ENTER-ing" through fields rather than tabbing.

All these methods worked but still kept the annoying sound until I added e.SuppressKeyPress.

Upvotes: 3

FXX
FXX

Reputation: 21

If you define Tab Order of all controls and make Form.KeyPreview = True, only need this:

    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

Upvotes: 2

Cadair Idris
Cadair Idris

Reputation: 607

This worked for me

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

Upvotes: 3

Mac
Mac

Reputation: 176

For those of you that code in 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

Upvotes: 0

Anca
Anca

Reputation:

You don't need to make an "enter event handler"

All you need to do is make a "central" KeyDown event:

example

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();
            }
        }
}

Then all you have to do is go to designer select all textboxes you wish to cycle through with EnterKey (select them by holding down Ctrl and clicking on textbox with the mouse) then go to Events(thunder like button), search Keydown event and type inside General_KeyDown. Now all your selected Textboxes will have the same keydown event :) This makes everything muuuuch much easier, cause imagine a form with 100 textboxes and you want to cycle through all with enter.... making an apart event for each texbox is... well not a proper way to make a program, it ain't neat. Hope it helped!!

Blockquote

Upvotes: 4

Patrick Desjardins
Patrick Desjardins

Reputation: 140743

You can write on the keyDown of any control:

        if (e.KeyCode == Keys.Enter)
        {

            if (this.GetNextControl(ActiveControl, true) != null)
            {
                e.Handled = true;
                this.GetNextControl(ActiveControl, true).Focus();

            }
        }

GetNextControl doesn't work on Vista.

To make it work with Vista you will need to use the code below to replace the this.GetNextControl...:

System.Windows.Forms.SendKeys.Send("{TAB}");

Upvotes: 12

JFV
JFV

Reputation: 1783

I would combine what Pharabus and arul answered like this:

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

Let me know if this helps! JFV

Upvotes: -1

arul
arul

Reputation: 14084

Taking a wild guess:

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

Upvotes: -1

Related Questions