Ich habe ein Textfeld mit der Eigenschaft .Multiline auf true gesetzt. In regelmäßigen Abständen füge ich neue Textzeilen hinzu. Ich möchte, dass das Textfeld automatisch zum untersten Eintrag (dem neuesten) blättert, wenn eine neue Zeile hinzugefügt wird. Wie schaffe ich das?
295
Antworten:
Wenn Sie verwenden
TextBox.AppendText(string text)
, wird automatisch zum Ende des neu angehängten Textes gescrollt. Die flackernde Bildlaufleiste wird vermieden, wenn Sie sie in einer Schleife aufrufen.Es ist auch eine Größenordnung schneller als die Verkettung auf dem
.Text
Grundstück. Dies hängt jedoch möglicherweise davon ab, wie oft Sie es anrufen. Ich habe mit einer engen Schleife getestet.Dies wird nicht gescrollt, wenn es aufgerufen wird, bevor das Textfeld angezeigt wird, oder wenn das Textfeld ansonsten nicht sichtbar ist (z. B. auf einer anderen Registerkarte eines TabPanels). Siehe TextBox.AppendText () nicht automatisch scrollen . Dies kann wichtig sein oder auch nicht, je nachdem, ob Sie eine automatische Bildlauffunktion benötigen, wenn der Benutzer das Textfeld nicht sehen kann.
Es scheint, dass die alternative Methode aus den anderen Antworten auch in diesem Fall nicht funktioniert. Eine Möglichkeit, dies zu umgehen, besteht darin, ein zusätzliches Scrollen für das
VisibleChanged
Ereignis durchzuführen :Intern
AppendText
macht so etwas:Es sollte jedoch keinen Grund geben, dies manuell zu tun.
(Wenn Sie es selbst dekompilieren, werden Sie feststellen, dass es möglicherweise effizientere interne Methoden verwendet und einen scheinbar geringfügigen Sonderfall aufweist.)
quelle
tb.Text += ....
Ich habe mich selbst gegessen und versucht, es mit WndProc und Marschällen zu schaffen. Jetzt fühle ich mich dumm: DSie können das folgende Codefragment verwenden:
Das wird automatisch bis zum Ende scrollen.
quelle
Es scheint, dass sich die Schnittstelle in .NET 4.0 geändert hat . Es gibt die folgende Methode , mit der alle oben genannten Ziele erreicht werden. Wie Tommy Engebretsen vorgeschlagen hat, wird es automatisch in einen TextChanged-Ereignishandler eingefügt.
quelle
TextBoxBase
Klasse imSystem.Windows.Controls.Primitives
Namespace befindet (PresentationFramework
Assembly, WPF). Diese Methode gibt es nicht und wird nicht funktionieren in WinForms, derenTextBox
Klasse erbt vonTextBoxBase
demSystem.Windows.Forms
Namensraum (System.Windows.Forms
Montag, WinForms).ScrollToEnd()
die Leistung extrem schlecht sein kann. In meiner App machte es über 50% der Profilierungszeit aus.Versuchen Sie, den vorgeschlagenen Code zum TextChanged-Ereignis hinzuzufügen:
quelle
hat bei mir nicht funktioniert (Windows 8.1, aus welchem Grund auch immer).
Und da ich immer noch auf .NET 2.0 bin, kann ich ScrollToEnd nicht verwenden.
Aber das funktioniert:
VB.NET:
quelle
Ich musste eine Aktualisierung hinzufügen:
quelle
Ich habe einen einfachen Unterschied gefunden, der in diesem Thread nicht angesprochen wurde.
Wenn Sie alle
ScrollToCarat()
Anrufe im Rahmen desLoad()
Ereignisses Ihres Formulars ausführen, funktioniert dies nicht. Ich habe gerade meinenScrollToCarat()
Anruf zumActivated()
Ereignis meines Formulars hinzugefügt , und es funktioniert einwandfrei.Bearbeiten
Es ist wichtig, dass Sie diesen Bildlauf nur beim ersten
Activated
Auslösen des Formularereignisses durchführen (nicht bei nachfolgenden Aktivierungen). Andernfalls wird jedes Mal gescrollt Mal wenn Ihr Formular aktiviert wird. ist wahrscheinlich etwas, das Sie nicht möchten.Wenn Sie also das
Activated()
Ereignis nur einfangen , um beim Laden Ihres Programms durch Ihren Text zu scrollen, können Sie das Ereignis im Ereignishandler selbst einfach abbestellen.Wenn Sie bei jeder Aktivierung Ihres Formulars andere Aufgaben ausführen müssen, können Sie a
bool
beim ersten Mal auf true setzenActivated()
Auslösen Ereignisses , damit Sie bei nachfolgenden Aktivierungen nicht scrollen, aber dennoch die anderen erforderlichen Aufgaben ausführen können machen.Wenn Sie
TextBox
sich auf einer Registerkarte befinden, die nicht die istSelectedTab
,ScrollToCarat()
hat dies keine Auswirkung. Sie müssen es also mindestens zur ausgewählten Registerkarte machen, während Sie scrollen. Sie können den Code in einYourTab.SuspendLayout();
und einYourTab.ResumeLayout(false);
Paar einschließen, wenn Ihr Formular dabei flackert.Ende der Bearbeitung
Hoffe das hilft!
quelle
Dadurch wird beim Ändern des Texts bis zum Ende des Textfelds gescrollt, der Benutzer kann jedoch weiterhin nach oben scrollen
getestet auf Visual Studio Enterprise 2017
quelle
Für alle anderen, die hier landen und eine Webforms-Implementierung erwarten, möchten Sie den endRequest-Ereignishandler des Page Request Managers ( https://stackoverflow.com/a/1388170/1830512 ) verwenden. Folgendes habe ich für meine TextBox auf einer Inhaltsseite von einer Masterseite aus getan. Bitte ignorieren Sie die Tatsache, dass ich keine Variable für das Steuerelement verwendet habe:
quelle
Das hat nur bei mir funktioniert ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (s);
Ich habe alle oben genannten Fälle ausprobiert, aber das Problem ist, dass in meinem Fall die Texte abnehmen, zunehmen und auch lange statisch bleiben können. statisch bedeutet, statische Länge (Linien), aber Inhalt ist unterschiedlich.
Also war ich am Ende mit einer Liniensprung-Situation konfrontiert, als die Länge (Linien) für einige Male gleich blieb ...
quelle
Ich benutze dafür eine Funktion:
quelle