364 Stimmen

Wie kann ich in einem mehrzeiligen Textfeld automatisch zum unteren Rand blättern?

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 kann ich das erreichen?

9voto

h4nd Punkte 91

Ich musste eine Aktualisierung vornehmen:

textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();
textBox1.Refresh();

8voto

sam byte Punkte 629

Ich benutze dies. Einfach, sauber und schnell!

txtTCPTxRx.AppendText(newText);

Im Folgenden finden Sie den von mir verwendeten Code

ThreadSafe(() =>
      {
          string newLog = $"{DateTime.Now:HH:mm:ss:ffff->}{dLog}{Environment.NewLine}";
          txtTCPTxRx.AppendText(newLog);
      });

6voto

Pete Punkte 141

Ich habe einen einfachen Unterschied gefunden, der in diesem Thread noch nicht angesprochen wurde.

Wenn Sie all das tun ScrollToCarat() Aufrufe als Teil des Formulars Load() funktioniert das nicht. Ich habe gerade meine ScrollToCarat() Aufruf des Formulars Activated() und es funktioniert einwandfrei.

bearbeiten

Es ist wichtig, dieses Scrollen nur beim ersten Mal durchzuführen, wenn das Formular Activated Ereignis ausgelöst wird (nicht bei späteren Aktivierungen), oder es wird ein Bildlauf durchgeführt jede wenn Ihr Formular aktiviert wird, was Sie wahrscheinlich nicht wollen.

Wenn Sie also nur die Activated() Ereignis, um Ihren Text zu scrollen, wenn Ihr Programm geladen wird, dann können Sie das Ereignis einfach innerhalb des Ereignishandlers selbst abbestellen, so:

Activated -= new System.EventHandler(this.Form1_Activated);

Wenn Sie andere Dinge tun müssen, wenn Ihr Formular aktiviert wird, können Sie eine bool auf wahr, wenn Sie zum ersten Mal Ihre Activated() Ereignis ausgelöst wird, so dass Sie bei nachfolgenden Aktivierungen nicht mehr blättern, aber immer noch die anderen Dinge tun können, die Sie tun müssen.

Auch wenn Ihr TextBox auf einer Registerkarte befindet, die nicht die SelectedTab , ScrollToCarat() hat keine Auswirkungen. Sie müssen also zumindest dafür sorgen, dass die Registerkarte beim Blättern ausgewählt ist. Sie können den Code in eine YourTab.SuspendLayout(); y YourTab.ResumeLayout(false); Paar, wenn Ihr Formular flackert, wenn Sie dies tun.

Ende der Bearbeitung

Ich hoffe, das hilft!

4voto

larrycook99 Punkte 47

In Bezug auf den Kommentar von Pete über eine TextBox auf einer Registerkarte, die Art und Weise bekam ich, dass zu arbeiten war das Hinzufügen

textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();

zum Ereignis Layout der Registerkarte.

1voto

Dadurch wird beim Ändern des Textes bis zum Ende des Textfeldes geblättert, aber der Benutzer kann immer noch nach oben blättern.

outbox.SelectionStart = outbox.Text.Length;
outbox.ScrollToEnd();

getestet mit Visual Studio Enterprise 2017

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X