144 votos

Automáticamente selecciona todo el texto en foco en WinForms TextBox

Cuando un C# WinForms cuadro de texto recibe el foco, la quiero para seleccionar todo el texto en el cuadro de texto.

Para ver a lo que me refiero, haga clic en su web barra de direcciones del navegador. Ver cómo todo el texto fue seleccionado? Yo quiero hacer eso.

PISTOLA más RÁPIDA de ALERTA: por favor, lea la siguiente información antes de contestar! Gracias chicos. :-)

De llamadas .SelectAll() durante el .Enter o .GotFocus eventos no el trabajo ya que si el usuario ha hecho clic en el cuadro de texto, el cursor se colocará donde se hace clic, por lo tanto deselecciona todos de texto.

También, llamando .SelectAll() durante la .Haga clic en evento no trabajo porque el usuario no podrá seleccionar cualquier texto con el ratón; el .SelectAll() llamada a mantener la sobreescritura del usuario de la selección de texto. )

101voto

Judah Himango Puntos 27365

Primero que todo, gracias por las respuestas! 9 el total de respuestas. Gracias.

Malas noticias: todas las respuestas que había algunas peculiaridades o no funcionan del todo bien (o a todos). He añadido un comentario a cada uno de tus mensajes.

Buenas noticias: he encontrado una forma de hacer el trabajo. Esta solución es bastante sencilla y parece que funciona en todos los escenarios (el ratón hacia abajo, selección de texto, la tabulación de enfoque, etc.)

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

Como lo que yo puedo decir, esto provoca un cuadro de texto para que se comportan exactamente igual que una web barra de direcciones del navegador.

Esperemos que esto ayuda a que el tipo de al lado, que intenta resolver esta engañosamente simple problema.

Gracias de nuevo, chicos, por todas tus respuestas que ayudó a que me llevan hacia el camino correcto.

68voto

Duncan Smart Puntos 9195

He encontrado una solución más sencilla para esto. Implica lanzando el SelectAll asincrónicamente utilizando Control.BeginInvoke que ocurre después de la intro y se han producido eventos de clic:

En C#:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

En VB.NET (gracias a Krishanu Dey)

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub

29voto

nzhenry Puntos 266

Su solución es buena, pero falla en un caso específico. Si darle el enfoque del cuadro de texto mediante la selección de un intervalo de texto en lugar de sólo hacer clic, la bandera de alreadyFocussed no tener establecida en true, así que cuando hace clic en el cuadro de texto por segunda vez, consigue selecciona todo el texto.

Aquí está mi versión de la solución. También he puesto el código en una clase que hereda de TextBox, así que la lógica está muy bien escondida.

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}

8voto

Todd Benning Puntos 87

Es un poco kludgey, pero en tu clic evento, usar SendKeys.Send ("{HOME} + {END}");

4voto

Jakub Kotrla Puntos 247

Evento click del control textbox. O incluso evento MouseCaptureChanged trabaja para mí. -Está bien. No funciona.

Así que tienes que hacer dos cosas:

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

Obras de tabulación (a través de cuadros de texto al)-llamar SelectAll() en entrar por si acaso...

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X