Laden...

Erste Zeile aus RichTextBox löschen ohne rumscrollen

Letzter Beitrag vor 12 Jahren 6 Posts 1.940 Views
Erste Zeile aus RichTextBox löschen ohne rumscrollen

Hallo zusammen,

ich hab eine RichTextBox, die Logeinträge live und in Farbe ausgibt. Damit nicht zuviel Speicher verbraten wird, hab ich die Anzeige auf 100 Zeilen beschränkt. Das heißt, wenn mehr als 100 Zeilen in der RTB bereits vorhanden sind, wird die erste Zeile wieder gelöscht, wenn eine neue Zeile hinzukommt.
Das funktioniert auch ganz gut mit dem folgenden Code


txtLog.Select(txtLog.TextLength, 0);
txtLog.SelectionColor = color;
txtLog.AppendText(message);

if (txtLog.Lines.Length > 100)
{
    txtLog.Select(0, txtLog.GetFirstCharIndexFromLine(1));
    txtLog.SelectedText = String.Empty;
    txtLog.SelectionStart = txtLog.TextLength;
}

Das Problem an der Sache ist, dass damit immer kurz an den Anfang der RTB gescrollt wird, die Zeile gelöscht wird und dann wieder ans Ende zurück gescrollt wird. Man hat also ein ständiges flackern auf dem Bildschirm.

Gibt es irgendeine Möglichkeit, wie man die erste Zeile löschen kann ohne das die Textbox scrollt? Wichtig dabei ist, dass die Farben auch nicht verloren gehen.

Du kannst der RichtTextBox die Windows-Message WM_SETREDRAW schicken um das BeginUpdate/EndUpdate-Verhalten nachzubilden und so das gesamte Repaint (de-)aktivieren. Siehe z.B. c# - RichTextBox syntax highlighting in real time--Disabling the repaint

Hallo Mossi,

was du allerdings problemlos über Google-Suche nach RIchTextBox.Select ohne scrollen oder eine ähnliche Suchanfrage hättest selbst herausfinden können.

herbivore

Manchmal ist die Lösung ganz einfach, aber gefunden hab ich die Message nicht ums verrecken.

Für die, die es interessiert hier die Lösung (hab beim Löschen der Zeile auch noch was geändert, weil die ursprüngliche Sache nicht richtig funktioniert hat):


Win32.SendMessage(txtLog.Handle, WM_SETREDRAW, 0, IntPtr.Zero);

txtLog.Select(txtLog.TextLength, 0);
txtLog.SelectionColor = color;
txtLog.AppendText(message);

while (txtLog.Lines.Length > 99)
{
    txtLog.SelectionStart = 0;
    txtLog.SelectionLength = txtLog.Text.IndexOf("\n", 0) + 1;
    txtLog.SelectedText = "";
}

txtLog.Select(txtLog.TextLength, 0);

Win32.SendMessage(txtLog.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
txtLog.Invalidate();

WM_SETREDRAW ist folgendermaßen definiert

private const int WM_SETREDRAW = 0x000B;

Manchmal ist die Lösung ganz einfach, aber gefunden hab ich die Message nicht ums verrecken.

Steht doch alles eindeutig und vollständig im Link, den ich gepostet habe. OK, man muss natürlich noch ein kleines Stück nach unten bis zur ersten Antwort scrollen...

Durch deine Antwort bin ich ja darauf gekommen. Danke nochmal dafür