Cuando un cuadro de texto C # WinForms recibe foco, quiero que se comporte como la barra de direcciones de su navegador.
Para ver a qué me refiero, haga clic en la barra de direcciones de su navegador web. Notarás el siguiente comportamiento:
- Al hacer clic en el cuadro de texto debería seleccionar todo el texto si el cuadro de texto no estaba enfocado previamente.
- El mouse hacia abajo y arrastrar en el cuadro de texto debe seleccionar solo el texto que he resaltado con el mouse.
- Si el cuadro de texto ya está enfocado, al hacer clic no se selecciona todo el texto.
- Enfocar el cuadro de texto mediante programación o mediante tabulación del teclado debería seleccionar todo el texto.
Quiero hacer exactamente esto en WinForms.
ALERTA DE ARMA MÁS RÁPIDA: ¡lea lo siguiente antes de responder! Gracias chicos. :-)
Llamar a .SelectAll () durante los eventos .Enter o .GotFocus no funcionará porque si el usuario hizo clic en el cuadro de texto, el cursor se colocará donde hizo clic, anulando la selección de todo el texto.
Llamar a .SelectAll () durante el evento .Click no funcionará porque el usuario no podrá seleccionar ningún texto con el mouse; la llamada .SelectAll () seguirá sobrescribiendo la selección de texto del usuario.
Llamar a BeginInvoke (cuadro de texto (Acción) .Seleccionar todo) en foco / ingresar evento enter no funciona porque infringe la regla # 2 anterior, seguirá anulando la selección del usuario en foco.
fuente
Respuestas:
En primer lugar, ¡gracias por las respuestas! 9 respuestas totales. Gracias.
Malas noticias: todas las respuestas tenían algunas peculiaridades o no funcionaban bien (o no funcionaban). Agregué un comentario a cada una de tus publicaciones.
Buenas noticias: he encontrado una manera de hacerlo funcionar. Esta solución es bastante sencilla y parece funcionar en todos los escenarios (pasar el mouse, seleccionar texto, enfocar, etc.)
Por lo que puedo decir, esto hace que un cuadro de texto se comporte exactamente como la barra de direcciones de un navegador web.
Esperemos que esto ayude al próximo tipo que intenta resolver este problema engañosamente simple.
Gracias de nuevo, muchachos, por todas sus respuestas que me ayudaron a encaminarme hacia el camino correcto.
fuente
alreadyFocused = true;
mouseUp fuera de la instrucción if. Porque si selecciona inmediatamente partes del texto, el siguiente clic seleccionará todo el texto nuevamente.Encontré una solución más simple para esto. Implica iniciar SelectAll de manera asíncrona
Control.BeginInvoke
para que ocurra después de que ocurran los eventos Enter y Click:C ª#:
En VB.NET (gracias a Krishanu Dey )
fuente
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
no funciona como se desea. Pero sigue siendo la solución más corta y elegante :)Su solución es buena, pero falla en un caso específico. Si asigna el foco TextBox seleccionando un rango de texto en lugar de simplemente hacer clic, el indicador ya enfocado no se establece en verdadero, por lo que cuando hace clic en TextBox por segunda vez, se selecciona todo el texto.
Aquí está mi versión de la solución. También puse el código en una clase que hereda TextBox, por lo que la lógica está muy bien escondida.
fuente
Es un poco burlón, pero en su evento de clic, use
SendKeys.Send( "{HOME}+{END}" );
.fuente
Haga clic en evento de cuadro de texto? O incluso el evento MouseCaptureChanged funciona para mí. - OKAY. no funciona
Entonces tienes que hacer 2 cosas:
También funciona para tabular (a través de cuadros de texto al uno): llame a SelectAll () en Enter por si acaso ...
fuente
Una respuesta de una línea que uso ... puede que te estés pateando ...
En el evento Enter:
txtFilter.BeginInvoke (nuevo MethodInvoker (txtFilter.SelectAll));
fuente
Ok, después de probarlo aquí es lo que quieres:
Esto seleccionó todo el texto en la entrada, pero luego me permitió resaltar parte del texto o permitirle resaltar en el primer clic.
Por solicitud:
Para mí, la tabulación en el control selecciona todo el texto.
fuente
Aquí hay una función auxiliar que lleva la solución al siguiente nivel: reutilizar sin herencia.
Para usar esto, simplemente llame a la función que pasa un TextBox y se ocupará de todos los bits desordenados por usted. Sugiero conectar todos sus cuadros de texto en el evento Form_Load. Puede colocar esta función en su formulario, o si lo desea, en algún lugar de una clase de utilidad para una reutilización aún mayor.
fuente
Esto funcionó para un cuadro de texto WPF / XAML.
fuente
Esto es similar a la respuesta popular de nzhenry , pero me resulta más fácil no tener que subclasificar:
fuente
SelectAll nunca funcionó para mí.
Esto funciona.
fuente
He encontrado una solución aún más simple:
Para asegurarse de que todo el texto esté seleccionado al hacer clic en un cuadro de texto, asegúrese de que el controlador Click llame al controlador Enter. ¡No hay necesidad de variables adicionales!
Ejemplo:
fuente
fuente
Curiosamente, creo que un ComboBox con DropDownStyle = Simple tiene exactamente el comportamiento que estás buscando.
(Si reduce la altura del control para no mostrar la lista, y luego en un par de píxeles más, no hay una diferencia efectiva entre ComboBox y TextBox).
fuente
¿Por qué no simplemente usa el evento MouseDown-Event del cuadro de texto? Funciona bien para mí y no necesita un booleano adicional. Muy limpio y simple, por ejemplo:
fuente
Llamé a SelectAll dentro del evento MouseUp y funcionó bien para mí.
fuente
Simplemente deriva una clase de TextBox o MaskedTextBox:
Y úsalo en tus formularios.
fuente
¿Has probado la solución sugerida en el foro de MSDN "Windows Forms General" que simplemente subclasifica TextBox?
fuente
En realidad, GotFocus es el evento correcto (mensaje realmente) en el que está interesado, ya que no importa cómo llegue al control, eventualmente lo obtendrá. La pregunta es cuándo llamas a SelectAll ().
Prueba esto:
fuente
Para un grupo de cuadros de texto en un formulario:
fuente
Sé que esto ya se resolvió, pero tengo una sugerencia que creo que es bastante simple.
En el caso del mouse up todo lo que tienes que hacer es colocar
Parece que me funciona en VB.NET (sé que esta es una pregunta de C # ... lamentablemente me veo obligado a usar VB en mi trabajo ... y estaba teniendo este problema, que es lo que me trajo aquí ... )
Todavía no he encontrado ningún problema con él ... excepto por el hecho de que no se selecciona inmediatamente al hacer clic, pero estaba teniendo problemas con eso ...
fuente
La siguiente solución me funciona. Agregué
OnKeyDown
yOnKeyUp
anulación de eventos para mantener el texto TextBox siempre seleccionado.fuente
Establezca la selección cuando abandone el control. Estará allí cuando vuelvas. Pestaña alrededor del formulario y cuando regrese al control, se seleccionará todo el texto.
Si entra con el mouse, el cursor se colocará correctamente en el punto donde hizo clic.
fuente
Solución muy simple:
EDITAR: OP original estaba particularmente preocupado por la secuencia de mouse-down / text-selection / mouse-up, en cuyo caso la solución simple anterior terminaría con una selección parcial del texto.
Esto debería resolver * el problema (en la práctica intercepto WM_SETCURSOR):
* En realidad, la siguiente secuencia termina con una selección de texto parcial, pero si mueve el mouse sobre el cuadro de texto, todo el texto se volverá a seleccionar:
mouse-down / text-selection / mouse-move-out-out-textbox / mouse-up
fuente
Me parece que funciona mejor cuando hago clic con el mouse y no lo suelto inmediatamente:
fuente
Mi solución es bastante primitiva pero funciona bien para mi propósito
fuente
Lo siguiente parece funcionar. El evento enter maneja las pestañas del control y MouseDown funciona cuando se hace clic en el control.
fuente
La respuesta puede ser en realidad bastante más simple que TODAS las anteriores, por ejemplo (en WPF):
por supuesto, no puedo saber cómo quiere usar este código, pero la parte principal a considerar aquí es: Primero llame a .Focus () y luego llame a .SelectAll ();
fuente
solo use selectall () en los eventos enter y haga clic
fuente
Creé un nuevo proyecto VB.Net Wpf. Creé un TextBox y usé lo siguiente para el código detrás:
fuente