Laden...

Zeilenanzeige neben Textbox

Erstellt von Term!nX vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.121 Views
Term!nX Themenstarter:in
104 Beiträge seit 2007
vor 16 Jahren
Zeilenanzeige neben Textbox

Hallo,

ich wollte einen Zeilenzähler in mein Programm einbauen. Ich weiss nicht genau wie man das nennt, aber links neben der Textbox steht dann die jeweilige Zeile.
Hier ist ein Bild von dem, was ich meine 🙂

Siehe Anhang

Meine Idee war, einen Backgroundthread zu erstellen, der die ganze Zeit textbox.Lines.GetLength(0) überprüft. Wenn die Anzahl der Zeilen > 0 ist, dann wird diese Anzahl gespeichert und irgendwas erstellt, dass die Zeilenummer angibt, vielleicht ein Label mit der Zahl oder so, da weiss ich noch nicht, wie ich das anstellen soll.
Jedenfalls wenn die Zeilenanzahl größer wird als der gespeicherte Wert, so wird dieser mit der neuen größeren Zahl überschrieben. Und immer wenn das der Fall ist, werden neue Labels erstellt, die die Zeilennummer anzeigen. Somit springt der Mechanismus nur an, wenn eine neue Zeile angelegt wird und nicht, wenn vorhandene Zeilen gelöscht werden.

Das war meine Idee, um die Zeilenanzahl festzustellen, allerdings habe ich nicht die geringste Ahnung, wie ich das mit Zeilennummer-Labels machen soll. Da die mitscrollen müssen, müssen sie ein Teil der Textbox werden, jedenfalls bin ich da ratlos 🙂

Grüße

Gelöschter Account
vor 16 Jahren
  1. einen backgroundthread zum zählen der zeilen zu verwenen ist als ob du einen tausend dollarschein zum anzünden einer zigarette verwendest.
  2. evtl tausende labels zu erzeugen um zeilennummern zu verwenden ist als ob du zahnstocher machen willst und pro baumstamm nur ein zahnstocher herstellst.

in jedem fall der falsche weg....

ganz einfach:
du machst eine eigene textbox, die am anfang der jeweiligen zeile einfach die zeilennummer zeichnet und die eingabe "area" einfach ein stückchen weiter nach rechts gerückt ist. evtl gibt es sowas schon auf codeproject... musst mal shcauen...

P
72 Beiträge seit 2007
vor 16 Jahren

ist doch eazy 😉

auf der textbox einfach ein TextChanged Event hinzufügen und diesen code dort einsetzen 😉


private void on_text_change(object sender, EventArgs e)
{
label1.Text = System.Convert.ToString(textBox1.Text.Length);
}

achja... den rest machst du einfach mit einer if abfrage und die zwischenergebnisse "zählerstände" in eine globale variable speichern

Liebe, Lebe, Lerne, Lache | Aldo-Giese.de Blog | Ohloh

Gelöschter Account
vor 16 Jahren

ich bezweifel das er mit dieser methode das bekommt was er möchte.

  1. wenn der text in der ersten zeile ist und den wert "hallo" hat dann würde im label eine 5 erscheinen. er möchte aber die zeilennummer haben.
  2. so ei ich das sehe ist die textbox mehrzeilig. womit man mehr als nur ein label hat.
  3. was machst du sobald er scrollt?
915 Beiträge seit 2006
vor 16 Jahren

Hrm, du könntest anhand des Textes durchgehen und nach "\n" suchen.
Bei jedem "\n" weist du dann das eine neue Zeile kommt.

Anschließend würde ich mir ein UserControl basteln: Mit einen TableLayoutPanel die TextBox einfügen und nebendran nen normales Panel mit einer einer dynamischen Breite. Im Panel würde ich dann die OnPaint überschreiben und dort mit der Scroulbar bewegung von der TextBox die jeweilige zeile die ich gesucht habe an die entsprechende visuelle Stelle hinmalen.

Die TextBox selbst an einer bestimmten Stelle zu übermalen würde glaube ich mehr Zeit in Anspruch nehmen, da man hierfür den ClibBound Bereich vom ClientRectangle versetzen müsste und ich denke das geht insgesammt länger.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Gelöschter Account
vor 16 Jahren

nein das geht eigendlich ...
beispiel: wie ich gesagt habe auf codeproject
extra controls zu erschaffen und das verhalten an die der textbox zu binden etc.. ist ein wenig oversized für diese einfache anforderung.

915 Beiträge seit 2006
vor 16 Jahren

Hrm, stimmt auch wieder bei CodeProject Suchen und rumkopieren geht schneller 😉

In der LineNumber.cpp in der CLineNumberStatic:👍nPaint() Methode kann man quasi alles fast 1 zu 1 rauskopieren und minimal anpassen. Bzw. über www.pinvoke.net die entsprechenden DllImports reinkopieren.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(