none
Oberste Zeile einer TextBox abfragen

    Frage

  • Hallo,

    ich möchte derzeit testweise einen kleinen Texteditor schreiben, welcher ebenfalls eine Zeilenangabe bieten soll. Diese habe ich in Form einer Listbox (ohne vertikalen Scrollbalken; Code dazu habe ich mit Google gefunden) realisiert.

    Selbstverständlich soll nun der eigentliche Text auch mit der Zeilenangabe synchronisiert werden. Soll heißen, wenn ich die ListBox (mit mehreren Zeilen) scrolle, soll die Listbox mitscrollen.

    Den derzeit oberen Wert der ListBox auszulesen und zu setzen, stellt kein Problem dar. Dafür gibt es ja die Eigenschaft TopIndex. Nun suche ich jedoch auch ein Äquivalent dafür von einer TextBox. Eine wirkliche Lösung habe ich nicht gefunden, deshalb frage ich hier nach.

    Ich hoffe, jemand kann mir einen Ansatz liefern (gern auch über Umwege), mit dem ich dies abfragen kann (oder sogar direkt Listbox und Textbox synchronisieren kann).

    Danke im Voraus.

    Mit freundlichen Grüßen

    Padarom

    Freitag, 18. Januar 2013 19:32

Antworten

  • Hallo Padarom,

    die Zeile kann man über die GetLineFromCharIndex-Eigenschaft abfragen.
    Den Index erhältst Du wiederum über GetCharIndexFromPosition (und die obere linke Ecke wäre 0, 0).

    Ob das allerdings beim Scrollen noch alles klappt, da habe ich leichte Zweifel.

    Gruß Elmar

    • Als Antwort markiert Padarom Freitag, 18. Januar 2013 21:29
    • Tag als Antwort aufgehoben Padarom Freitag, 18. Januar 2013 21:39
    • Als Antwort markiert Padarom Samstag, 19. Januar 2013 00:08
    Freitag, 18. Januar 2013 20:54
    Beantworter
  • Jedes Control hat seine Grenzen, und die RichTextBox wegen den Formatierungen eindeutig vor der TextBox. 5000 Codezeilen flackern bei mir jetzt nicht in irgend einer Art. Könnte aber auch an der CPU Leistung liegen ;)

    Die RichTextBox hat aber noch einen Vorteil für dich: Du kannst ein Syntax Highlight einbauen. Wenn du schonmal ein paar Zeilen Quellcode im normalen Windows Editor gelesen hast, wirst du vielleicht gemerkt haben, das es zwar geht, aber man nicht so schnell bestimmte Schlüsselwörter, Methoden, größere Texte usw findet. Solche wörtchen wie static, void, int, class, struct, enum, public, private, protected, while, for, select, const, where, do, double, float, string, ... findet man nunmal schneller wenn Sie farblich hervorgehoben sind. So geht es dann mit Strings, Klassen usw. weiter. Von da her würde ich mir das mit der TextBox noch mal überlegen.


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    • Als Antwort markiert Padarom Samstag, 19. Januar 2013 00:08
    Freitag, 18. Januar 2013 23:10
    Moderator

Alle Antworten

  • Hallo Padarom,

    die Zeile kann man über die GetLineFromCharIndex-Eigenschaft abfragen.
    Den Index erhältst Du wiederum über GetCharIndexFromPosition (und die obere linke Ecke wäre 0, 0).

    Ob das allerdings beim Scrollen noch alles klappt, da habe ich leichte Zweifel.

    Gruß Elmar

    • Als Antwort markiert Padarom Freitag, 18. Januar 2013 21:29
    • Tag als Antwort aufgehoben Padarom Freitag, 18. Januar 2013 21:39
    • Als Antwort markiert Padarom Samstag, 19. Januar 2013 00:08
    Freitag, 18. Januar 2013 20:54
    Beantworter
  • Danke bereits, der Code klappt soweit ganz gut.

    Der Code ist derzeit wie folgt aufgebaut:

    private void codeTxt_TextChanged(object sender, EventArgs e)
    {
          int index = codeTxt.GetCharIndexFromPosition(new Point(0, 0));
          int line = codeTxt.GetLineFromCharIndex(index);
          myListBox1.TopIndex = line + 1;
    }

    Deine Zweifel waren jedoch berechtigt. Nur wenn ich über die Enter- oder Backspace-Taste die Textbox ändere, wird die Zeilenangabe synchronisiert. Beim Scrollen mit dem Mausrad oder dem Scrollbalken bleiben die Zeilenangaben jedoch.

    Könnte man dies noch irgendwie in den Code einbeziehen?


    • Bearbeitet Padarom Freitag, 18. Januar 2013 21:41
    Freitag, 18. Januar 2013 21:39
  • Hallo, ich hänge mich mal rein. Warum machst du das überhaupt mit einer ListBox? Folgendes halte ich für eleganter gelöst: http://www.codeproject.com/Articles/12152/Numbering-lines-of-RichTextBox-in-NET-2-0

    Man kann es noch verbessern, aber es sollte zeigen das es auch "einfacher" geht.

    Ich hoffe das hilft dir weiter ;)


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    • Als Antwort markiert Padarom Samstag, 19. Januar 2013 00:08
    • Tag als Antwort aufgehoben Padarom Samstag, 19. Januar 2013 00:08
    Freitag, 18. Januar 2013 21:57
    Moderator
  • Danke für den Link. Ich bin bei meinen Suchen auch immer wieder auf die RichTextBox gestoßen, jedoch habe ich von vielen Leuten gelesen, dass diese bei einer großen Zeilenzahl (Mein Editor sollte vorerst Quellcodedateien mit ~2000-5000 Zeilen bearbeiten können) langsam oder flackernd werden.

    Daher bin ich von diesen zurückgeschreckt und habe mich stattdessen für eine normale TextBox mit MultipleLines entschieden.

    Wenn dies gar nicht der Fall ist, greife ich auch gerne zur RichTextBox.

    Freitag, 18. Januar 2013 22:05
  • Jedes Control hat seine Grenzen, und die RichTextBox wegen den Formatierungen eindeutig vor der TextBox. 5000 Codezeilen flackern bei mir jetzt nicht in irgend einer Art. Könnte aber auch an der CPU Leistung liegen ;)

    Die RichTextBox hat aber noch einen Vorteil für dich: Du kannst ein Syntax Highlight einbauen. Wenn du schonmal ein paar Zeilen Quellcode im normalen Windows Editor gelesen hast, wirst du vielleicht gemerkt haben, das es zwar geht, aber man nicht so schnell bestimmte Schlüsselwörter, Methoden, größere Texte usw findet. Solche wörtchen wie static, void, int, class, struct, enum, public, private, protected, while, for, select, const, where, do, double, float, string, ... findet man nunmal schneller wenn Sie farblich hervorgehoben sind. So geht es dann mit Strings, Klassen usw. weiter. Von da her würde ich mir das mit der TextBox noch mal überlegen.


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    • Als Antwort markiert Padarom Samstag, 19. Januar 2013 00:08
    Freitag, 18. Januar 2013 23:10
    Moderator