Tengo un cuadro de texto con la propiedad .Multiline establecida en true. A intervalos regulares, le agrego nuevas líneas de texto. Me gustaría que el cuadro de texto se desplace automáticamente a la entrada más inferior (la más nueva) cada vez que se agrega una nueva línea. ¿Cómo logro esto?
295
Respuestas:
Si lo usa
TextBox.AppendText(string text)
, se desplazará automáticamente hasta el final del texto recién agregado. Evita la barra de desplazamiento parpadeante si la está llamando en un bucle.También resulta ser un orden de magnitud más rápido que concatenar en la
.Text
propiedad. Aunque eso podría depender de con qué frecuencia lo estás llamando; Estaba probando con un circuito cerrado.Esto no se desplazará si se llama antes de que se muestre el cuadro de texto, o si el cuadro de texto no está visible (por ejemplo, en una pestaña diferente de un Panel de pestañas). Consulte TextBox.AppendText () sin desplazamiento automático . Esto puede o no ser importante, dependiendo de si necesita desplazamiento automático cuando el usuario no puede ver el cuadro de texto.
Parece que el método alternativo de las otras respuestas tampoco funciona en este caso. Una forma de evitarlo es realizar un desplazamiento adicional en el
VisibleChanged
evento:Internamente,
AppendText
hace algo como esto:Pero no debería haber ninguna razón para hacerlo manualmente.
(Si lo descompila usted mismo, verá que usa algunos métodos internos posiblemente más eficientes, y tiene lo que parece ser un caso especial menor).
fuente
tb.Text += ....
WndProc y mariscales. Ahora me siento estúpido: DPuede usar el siguiente fragmento de código:
que se desplazará automáticamente hasta el final.
fuente
Parece que la interfaz ha cambiado en .NET 4.0. Existe el siguiente método que logra todo lo anterior. Como sugirió Tommy Engebretsen, ponerlo en un controlador de eventos TextChanged lo hace automático.
fuente
TextBoxBase
clase en elSystem.Windows.Controls.Primitives
espacio de nombres (PresentationFramework
ensamblaje, WPF). Este método no existe y no funcionará en Windows Forms, cuyaTextBox
hereda la clase deTextBoxBase
en elSystem.Windows.Forms
espacio de nombres (System.Windows.Forms
de ensamblaje, WinForms).ScrollToEnd()
puede tener un rendimiento extremadamente bajo. En mi aplicación representaba más del 50% del tiempo de creación de perfiles.Intente agregar el código sugerido al evento TextChanged:
fuente
no funcionó para mí (Windows 8.1, sea cual sea el motivo).
Y como todavía estoy en .NET 2.0, no puedo usar ScrollToEnd.
Pero esto funciona:
VB.NET:
fuente
Necesitaba agregar una actualización:
fuente
Encontré una diferencia simple que no se ha abordado en este hilo.
Si está haciendo todas las
ScrollToCarat()
llamadas como parte delLoad()
evento de su formulario , no funciona. Acabo de agregar miScrollToCarat()
llamada alActivated()
evento de mi formulario , y funciona bien.Editar
Es importante hacer este desplazamiento solo la primera vez que se activa el
Activated
evento del formulario (no en activaciones posteriores), o se desplazará cada vez que se active su formulario, que es algo que probablemente no desee.Entonces, si solo está atrapando el
Activated()
evento para desplazar su texto cuando se carga su programa, entonces simplemente puede darse de baja del evento dentro del controlador de eventos, por lo tanto:Si tiene otras cosas que debe hacer cada vez que se activa su formulario, puede establecer un valor
bool
verdadero la primera vez que se activa suActivated()
evento, por lo que no se desplazará en las activaciones posteriores, pero aún puede hacer las otras cosas que necesita para hacer.Además, si
TextBox
está en una pestaña que no es laSelectedTab
,ScrollToCarat()
no tendrá ningún efecto. Por lo tanto, necesita al menos convertirlo en la pestaña seleccionada mientras se desplaza. Usted puede envolver el código en unaYourTab.SuspendLayout();
yYourTab.ResumeLayout(false);
par si el formulario parpadea cuando se hace esto.Fin de editar
¡Espero que esto ayude!
fuente
Esto se desplazará hasta el final del cuadro de texto cuando se cambie el texto, pero aún permite al usuario desplazarse hacia arriba
probado en Visual Studio Enterprise 2017
fuente
Para cualquier otra persona que aterrice aquí y espere ver una implementación de formularios web, desea usar el controlador de eventos endRequest del Page Request Manager ( https://stackoverflow.com/a/1388170/1830512 ). Esto es lo que hice para mi TextBox en una página de contenido de una página maestra, ignore el hecho de que no utilicé una variable para el control:
fuente
Esto solo funcionó para mí ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (s);
Intenté todos los casos anteriores, pero el problema es que, en mi caso, los textos pueden disminuir, aumentar y también pueden permanecer estáticos durante mucho tiempo. medios estáticos, longitud estática (líneas) pero el contenido es diferente.
Entonces, estaba enfrentando una situación de salto de línea al final cuando la longitud (líneas) permanece igual algunas veces ...
fuente
Yo uso una función para esto:
fuente