How to remove the focus from a TextBox in WinForms?

C#.NetWinformsTextboxFocus

C# Problem Overview


I need to remove the focus from several TextBoxes. I tried using:

textBox1.Focused = false;

Its ReadOnly property value is true.

I then tried setting the focus on the form, so as to remove it from all the TextBoxes, but this also fails to work:

this.Focus();

and the function returns false when a textbox is selected.

So, how do I remove the focus from a TextBox?

C# Solutions


Solution 1 - C#

You need some other focusable control to move the focus to.

Note that you can set the Focus to a Label. You might want to consider where you want the [Tab] key to take it next.

Also note that you cannot set it to the Form. Container controls like Form and Panel will pass the Focus on to their first child control. Which could be the TextBox you wanted it to move away from.

Solution 2 - C#

Focusing on the label didn't work for me, doing something like label1.Focus() right? the textbox still has focus when loading the form, however trying Velociraptors answer, worked for me, setting the Form's Active control to the label like this:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

Solution 3 - C#

You can add the following code:

this.ActiveControl = null;  //this = form

Solution 4 - C#

Try disabling and enabling the textbox.

Solution 5 - C#

You can also set the forms activecontrol property to null like

ActiveControl = null;

Solution 6 - C#

Focus sets the input focus, so setting it to the form won't work because forms don't accept input. Try setting the form's ActiveControl property to a different control. You could also use Select to select a specific control or SelectNextControl to select the next control in the tab order.

Solution 7 - C#

Try this one:

First set up tab order.

Then in form load event we can send a tab key press programmatically to application. So that application will give focus to 1st contol in the tab order.

in form load even write this line.

SendKeys.Send("{TAB}");

This did work for me.

Solution 8 - C#

This post lead me to do this:

ActiveControl = null;

This allows me to capture all the keyboard input at the top level without other controls going nuts.

Solution 9 - C#

I've found a good alternative! It works best for me, without setting the focus on something else.

Try that:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

Solution 10 - C#

A simple solution would be to kill the focus, just create your own class:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

Solution 11 - C#

I made this on my custom control, i done this onFocus()

this.Parent.Focus();

So if texbox focused - it instantly focus textbox parent (form, or panel...) This is good option if you want to make this on custom control.

Solution 12 - C#

It seems that I don't have to set the focus to any other elements. On a Windows Phone 7 application, I've been using the Focus method to unset the Focus of a Textbox.

Giving the following command will set the focus to nothing:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

It worked for me, but I don't know why didn't it work for you :/

Solution 13 - C#

    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

Solution 14 - C#

The way I get around it is to place all my winform controls. I make all labels and non-selecting winform controls as tab order 0, then my first control as tab order 2 and then increment each selectable control's order by 1, so 3, 4, 5 etc...

This way, when my Winforms start up, the first TextBox doesn't have focus!

Solution 15 - C#

you can do this by two method

  • just make the "TabStop" properties of desired textbox to false now it will not focus even if you have one text field
  • drag two text box
  1. make one visible on which you don't want foucus which is textbox1
  2. make the 2nd one invisible and go to properties of that text field and select

> tabindex value to 0 of textbox2

  1. and select the tabindex of your textbox1 to 1 now it will not focus on textbox1

Solution 16 - C#

If all you want is the optical effect that the textbox has no blue selection all over its contents, just select no text:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

After this, when adding content with .Text += "...", no blue selection will be shown.

Solution 17 - C#

Please try set TabStop to False for your view control which is not be focused.

For eg:

txtEmpID.TabStop = false;

Solution 18 - C#

You can try:

textBox1.Enable = false;

Solution 19 - C#

using System.Windows.Input

Keyboard.ClearFocus();

Solution 20 - C#

Kinda late to the party in 2022, however none of the solutions here worked for me (idk why) using .Net_6.0_windows, so I've come up with this solution:

Label focusoutLabel = new Label() { 
    Text = "",
    Name = "somegenericplaceholdernamethatwillneverbeusedinmyprogram",
    Visible = false,
};
this.Controls.Add(focusoutLabel);
this.ActiveControl = focusoutLabel;

^Place this code to your Form load handler^

Solution 21 - C#

In the constructor of the Form or UserControl holding the TextBox write

SetStyle(ControlStyles.Selectable, false);

After the InitializeComponent(); Source: https://stackoverflow.com/a/4811938/5750078

Example:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCallum RogersView Question on Stackoverflow
Solution 1 - C#Henk HoltermanView Answer on Stackoverflow
Solution 2 - C#WhySoSeriousView Answer on Stackoverflow
Solution 3 - C#FTheGodfatherView Answer on Stackoverflow
Solution 4 - C#Spencer RuportView Answer on Stackoverflow
Solution 5 - C#marcigo36View Answer on Stackoverflow
Solution 6 - C#VelociraptorsView Answer on Stackoverflow
Solution 7 - C#charith rasangaView Answer on Stackoverflow
Solution 8 - C#Kristopher IvesView Answer on Stackoverflow
Solution 9 - C#kaspiView Answer on Stackoverflow
Solution 10 - C#VladLView Answer on Stackoverflow
Solution 11 - C#TommixView Answer on Stackoverflow
Solution 12 - C#Bhawk1990View Answer on Stackoverflow
Solution 13 - C#TorusView Answer on Stackoverflow
Solution 14 - C#CosineCuberView Answer on Stackoverflow
Solution 15 - C#AdiiiView Answer on Stackoverflow
Solution 16 - C#RolandView Answer on Stackoverflow
Solution 17 - C#ShaheerView Answer on Stackoverflow
Solution 18 - C#Vương Hữu ThiệnView Answer on Stackoverflow
Solution 19 - C#Herman SakumaView Answer on Stackoverflow
Solution 20 - C#TDiblikView Answer on Stackoverflow
Solution 21 - C#Alvaro Rodriguez ScelzaView Answer on Stackoverflow