¿Cómo eliminar el foco de un TextBox en WinForms?

110

Necesito quitar el foco de varios TextBoxes. Intenté usar:

textBox1.Focused = false;

Su ReadOnlyvalor de propiedad es true.

Luego intenté establecer el enfoque en el formulario, para eliminarlo de todos los TextBoxes, pero esto tampoco funciona:

this.Focus();

y la función regresa falsecuando se selecciona un cuadro de texto.

Entonces, ¿cómo elimino el foco de un TextBox?

Callum Rogers
fuente

Respuestas:

113

Necesita algún otro control enfocable para mover el enfoque.

Tenga en cuenta que puede establecer el enfoque en una etiqueta. Es posible que desee considerar dónde desea que la tecla [Tab] lo lleve a continuación.

También tenga en cuenta que no puede establecerlo en el formulario. Los controles de contenedor como Formulario y Panel pasarán el Enfoque a su primer control secundario. ¿Cuál podría ser el TextBox del que quería que se alejara?

Henk Holterman
fuente
Gracias; Intenté enfocarme en una etiqueta y ahora el cuadro de texto se desenfoca. Parece que no puedes concentrarte en un formulario por alguna razón.
Callum Rogers
7
Los controles de contenedor (formulario, panel) pasarán el enfoque a su primer control secundario.
Henk Holterman
Gran sugerencia. Esto resolvió mi problema. Estoy usando KeyPress contra el formulario en sí y tengo varios botones, etc. El problema es que la aplicación está recibiendo información de un lector de tarjetas, por lo que si el enfoque se aleja del formulario en sí, se desata el infierno. Centrarme en una etiqueta después de hacer clic en un botón resolvió mi problema. ¡Muchas gracias!
joelc
62

Centrarme en la etiqueta no funcionó para mí, hacer algo como label1.Focus()¿no? el cuadro de texto todavía tiene el foco al cargar el formulario, sin embargo, intentar la respuesta de Velociraptors funcionó para mí, estableciendo el control Activo del Formulario en la etiqueta de esta manera:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
Por qué tan serio
fuente
7
Ojalá pudiera darte un millón de flechas hacia arriba. Probé TODO lo que la gente sugirió, este es el único que funcionó. por alguna razón, el cuadro de texto SIEMPRE robó el foco de todo ...
eladyanai
3
Esto también funciona para controles de contenedores como paneles. Solo quería eliminar el enfoque por completo y funcionó:this.ActiveControl = panelOnMyForm;
Tim Schmelter
52

Puede agregar el siguiente código:

this.ActiveControl = null;  //this = form
FEl Padrino
fuente
7
Creo que esta es la mejor respuesta. Muchos de los otros métodos, como "Focus", si lee MSDN, se enumeran como métodos de bajo nivel para diseñadores de control. Si desea que todo lo demás esté "no seleccionado", este parece ser el enfoque más fácil ya que, bueno, es solo una pequeña línea.
Rostov
1
Esta puede ser la mitad de la razón por la que Microsoft agregó esta propiedad en primer lugar.
Panzercrisis
Esta parece la solución más elegante, funcionó perfectamente en mi caso.
NetWave
Realmente quiero que esta respuesta funcione porque parece que debería hacerlo, pero en mi caso no funcionó porque si bien activó el evento Leave, no activó los eventos Validating / Validated.
Rhys Jones
32

Intente deshabilitar y habilitar el cuadro de texto.

Spencer Ruport
fuente
5
Esto funciona bastante bien, ya que selecciona automáticamente el siguiente control en la lista de pestañas mientras tanto.
Nick
3
Estoy desarrollando en Silverlight usando MVVM e implementé esto usando un comportamiento dirigido a un TextBox. Como no tenía otro UIElement a mano para establecer el enfoque en la solución Desactivar / Activar funcionó de maravilla. ¡Gracias!
Albert Oldfield
¿Cómo puedo desactivarlo?
miguelmpn
1
@miguelmpn textBox1.Enabled = false;desactivará su cuadro de texto. y configurarlo para truevolver a habilitarlo.
Raktim Biswas
24

También puede establecer la activecontrolpropiedad de formularios en Me nullgusta

ActiveControl = null;
marcigo36
fuente
7
Espero que la gente se desplace hacia abajo hasta esto y no solo use la solución alternativa marcada como respuesta
makoshichi
Sigue siendo la mejor respuesta hasta el día de hoy, amigo, acepta mi voto a favor.
xoxel
8

Focusestablece el foco de entrada, por lo que establecerlo en el formulario no funcionará porque los formularios no aceptan la entrada. Intente establecer la ActiveControlpropiedad del formulario en un control diferente. También puede utilizar Selectpara seleccionar un control específico o SelectNextControlpara seleccionar el siguiente control en el orden de tabulación.

Velociraptores
fuente
1
Probé todo lo demás aquí y Select()funcionó para mí.
Derek W
8

Prueba este:

Primero configure el orden de tabulación.

Luego, en el evento de carga de formulario, podemos enviar una tecla de tabulación mediante programación a la aplicación. Para que la aplicación se centre en el primer control en el orden de tabulación.

en la carga de formulario incluso escriba esta línea.

SendKeys.Send("{TAB}");

Esto funcionó para mí.

charith rasanga
fuente
4

Esta publicación me llevó a hacer esto:

ActiveControl = null;

Esto me permite capturar toda la entrada del teclado en el nivel superior sin que otros controles se vuelvan locos.

Kristopher Ives
fuente
3

¡He encontrado una buena alternativa! Funciona mejor para mí, sin poner el foco en otra cosa.

Trata eso:

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

Hice esto en mi control personalizado, hice esto enFocus ()

this.Parent.Focus();

Entonces, si se enfoca en texbox, se enfoca instantáneamente en el padre del cuadro de texto (formulario, o panel ...). Esta es una buena opción si desea hacer esto en un control personalizado.

Tommix
fuente
2

Parece que no tengo que fijar el foco en ningún otro elemento. En una aplicación de Windows Phone 7, he estado usando el método Focus para desarmar el Focus de un cuadro de texto.

Dar el siguiente comando no establecerá el foco en nada:

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

Funcionó para mí, pero no sé por qué no funcionó para usted: /

Bhawk1990
fuente
2

Una solución simple sería eliminar el foco, simplemente cree su propia clase:

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);
    }
}
VladL
fuente
Exactamente el tipo de solución que estaba buscando. ¡Gracias!
LeftyCoder
1
    //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();
                });
            }
        }
    }
Toro
fuente
0

La forma en que me muevo es colocando todos mis controles winform. Hago todas las etiquetas y controles winform no seleccionados como orden de tabulación 0, luego mi primer control como orden de tabulación 2 y luego incremento el orden de cada control seleccionable en 1, por lo que 3, 4, 5, etc.

De esta manera, cuando se inician mis Winforms, ¡el primer TextBox no tiene foco!

CosineCuber
fuente
0

puedes hacer esto por dos métodos

  • simplemente haga que las propiedades de "TabStop" del cuadro de texto deseado sean falsas, ahora no se enfocará incluso si tiene un campo de texto
  • arrastre dos cuadros de texto

    1. haz uno visible en el que no quieres foucus que es textbox1
    2. haga que el segundo sea invisible y vaya a las propiedades de ese campo de texto y seleccione

tabindex valor a 0 de textbox2

  1. y seleccione el tabindex de su cuadro de texto1 a 1 ahora no se centrará en el cuadro de texto1
Adiii
fuente
0

Si todo lo que desea es el efecto óptico de que el cuadro de texto no tiene una selección azul en todo su contenido, simplemente no seleccione texto:

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

Después de esto, al agregar contenido con .Text += "...", no se mostrará ninguna selección azul.

Roland
fuente
0

Intente configurarlo TabStopenFalse para su control de vista que no está enfocado.

Por ejemplo:

txtEmpID.TabStop = false;
Shaheer
fuente
-1

En el constructor del formulario o UserControl sosteniendo el TextBox escribir

SetStyle(ControlStyles.Selectable, false);

Después de InitializeComponent (); Fuente: https://stackoverflow.com/a/4811938/5750078

Ejemplo:

public partial class Main : UserControl
{

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