Entwickler-Ecke
WinForms - RichTextBox Text aus Zeile editieren
WebLover - Di 20.10.15 12:18
Titel: RichTextBox Text aus Zeile editieren
Hallo meine lieben.
Ich habe eine RichTextBox. Wenn man dort zum Beispiel ein Wort wie Haus reinschreibt, dann soll dieser Text Kopiert werden. Außerdem soll am Andang der Zeile etwas eingefügt werden und am Ende. Wie kann ich das realisieren?
z.B.:
Eingabe: "\t" Haus
Resultat: 0Haus0 00Haus0
Wie kann ich sowas aus einer Zeile machen?
Mfg :)
Th69 - Di 20.10.15 16:48
Hallo,
du mußt schon die einzelne(n) Zeile(n) selber analysieren (RichTextBox.Lines). Mittels des TextChanged-Ereignisses und evtl. der aktuellen Selection kannst du auf Änderungen reagieren.
Das Analysieren der einzelnen Wörter mußt du jedoch selber machen (z.B. per String.IndexOf oder String.Split etc.).
Die Gefahr jedoch beim Koopieren sehe ich dadrin, daß beim x-maligen Aufruf immer wieder die Wörter verdoppelt werden (d.h. du mußt die angefügten Zeichen - in deinem Beispiel die '0' - mitbetrachten).
WebLover - Mi 21.10.15 17:32
Hallo. Ich habe jetzt etwas hilfreiches hinbekommen.
C#-Quelltext
1: 2: 3:
| string s = this.richTextBox1.SelectedText.ToString(); this.richTextBox1.SelectedText = ""; this.richTextBox1.SelectedText += "<" + s + "></" + s + ">"; |
So möchte ich es haben. Es dient dem HTML- Editor. Gibt es nun noch eine Variante, den Text der einzelnen Zeile auswählen zu lassen?
Mfg :)
Th69 - Mi 21.10.15 18:26
Ah, jetzt verstehe ich (hättest vllt. besser gleich dein eigentliches Anliegen nennen sollen ;- )
Wenn du die Funktionalität auf einen Button oder Hotkey legst, könntest du anhand der aktuellen Cursorposition (SelectionStart) das aktuelle Wort ermitteln (links und rechts so weit suchen bis kein Buchstabe mehr da ist) und dann die Ersetzung per SelectedText durchführen.
Ansonsten such auch mal einfach nach "c# richtextbox replace text"...
Csharp-programmierer - Mi 21.10.15 18:59
Wie kann ich die Länge abrufen? Mit
SelectionStart kann man die Position des Cursors abrufen. Wie kann man so die Textlänge ermitteln?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| int i = this.richTextBox1.SelectionStart; string g = this.richTextBox1.SelectedText.ToString(); this.richTextBox1.SelectedText = ""; string[] split = g.Split(new Char[] {' '});
foreach (string s in split) { if (s.IndexOf("#") != -1) { xx = s.Replace("#", ""); } if (s.IndexOf(".") != -1) { yy = s.Replace(".", ""); } } |
Das wäre nun das einzige Problem noch.
WebLover - Do 22.10.15 18:19
Ich müsste jetzt nur noch wissen, wie ich den Text einer Zeile der RichTextBox markiere.
Th69 - Do 22.10.15 18:29
Entweder SelectionStart und SelectionLength setzen oder aber die Methode Select(start, length) aufrufen.
WebLover - Do 22.10.15 18:39
Hallo :)
Ich habe es jetzt so gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| int x = this.richTextBox1.SelectionLength; int y = this.richTextBox1.SelectionStart; this.richTextBox1.Select(x, y); string s = this.richTextBox1.SelectedText.ToString(); this.richTextBox1.SelectedText = ""; this.richTextBox1.SelectedText += "<" + s + "></" + s + ">"; |
Wenn ich den Text in die erste Zeile schreibe, funktioniert es. Wenn ich jedoch eine andere Zeile benutze, funktioniert es nicht :(
Moderiert von
Th69: Beitragsformatierung überarbeitet.
Th69 - Do 22.10.15 20:03
Deine ersten 3 Zeilen ergeben keinen Sinn (du selektierst den Text, der vorher schon selektiert war).
Wenn du Text anhand einer bestimmten Zeile selektieren willst, dann mußt du dafür dann
GetFirstCharIndexFromLine aufrufen:
C#-Quelltext
1:
| richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(y) + x; |
(wobei x und y dann Spalte und Zeile entsprechen).
PS: Und deine letzten 2 Zeilen kannst du zu
C#-Quelltext
1:
| richTextBox1.SelectedText = "<" + s + "></" + s + ">"; |
einkürzen.
Csharp-programmierer - Do 22.10.15 20:12
Und wie bekomme ich den Wert für X und Y?
Th69 - Fr 23.10.15 11:27
Könntest du bitte etwas präziser dein Anliegen formulieren?
Du mußt doch selber wissen, was du jetzt selektieren willst (s. meinen ersten Beitrag).
WebLover - Fr 23.10.15 13:57
Ich möchte den Text der aktuelle Zeile auslesen. In ihrem Beispiel:
C#-Quelltext
1:
| this.richTextBox1.SelectionStart = this.richTextBox1.GetFirstCharIndexFromLine(y) + x; |
Und wie bekomme ich die Werte für X und Y?
Ralf Jansen - Fr 23.10.15 14:14
C#-Quelltext
1: 2: 3:
| var linePos = richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart); var lineContent = richTextBox1.Lines[linePos]; |
Vielleicht nochmal genauer erklären was du willst. Das beantwortet deine Frage ich bezweifle aber das es das ist was du willst.
Willst du vileicht eher das Wort in dem der Cursor steht oder den aktuell markierten Teil?
P.S. Vielleicht solltest du dich auf einen Account beschränken.
Csharp-programmierer - Fr 23.10.15 17:24
Uch möchte den Text auslesen, an in der aktuelle Zeile ist. Man gibt in eine Zeile z.B. center ein, drückt F1 und der Text ändert aich in <center></center>. Und sowas in der Art für die nächsten Zeilen auch. Ich bräuchte nur den Text der Zeile, in der sich der Cursor gerade befindet.
WebLover - Fr 23.10.15 19:30
Ich habe jetzt den Quellcode:
C#-Quelltext
1: 2: 3:
| var x = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var s = this.richTextBox1.Lines[x]; this.richTextBox1.Lines[x] = "<" + s + "></" + s + ">"; |
Die mittlere Zeile wird als Fehler angegeben.
Ich habe die PN gelesen und entschuldige mich dafür, dass ich 2 Accounts erstellt habe. Den Account "WebLover" können Sie löschen. Entschuldigung. Mfg
Ralf Jansen - Fr 23.10.15 19:46
Die ist korrekt. Es hilft nicht nur zu sagen das man einen Fehler bekommt man sollte auch sagen welchen.
C#-Quelltext
1:
| this.richTextBox1.Lines[x] = "<" + s + "></" + s + ">"; |
Das wird allerdings nicht funktionieren. Zitat aus der Dokumentation zur Lines Property.
Zitat: |
By default, the collection of lines is a read-only copy of the lines in the TextBox. To get a writable collection of lines, use code similar to the following: textBox1.Lines = new string[] { "abcd" }; |
Wie man das löst überlasse ich dir als kleine Übung ;)
Th69 - Fr 23.10.15 20:05
Hier war der Ansatz mittels
C#-Quelltext
1:
| richTextBox1.SelectedText = "<" + s + "></" + s + ">"; |
schon zielführender.
Jetzt mußt du nur noch diese Zeile markieren (selektieren)...
Csharp-programmierer - Fr 23.10.15 20:24
Für mich ist das eine schwierige Übung, da ich noch nicht studiert habe und die noch nicht in der Schule habe. Ich habe es jetzt so gemacht, jedoch weiß ich nicht, wozu ich dies brauche :nixweiss:
C#-Quelltext
1: 2: 3: 4:
| this.richTextBox1.Lines = new string[] {"<", ">"}; int y = this.richTextBox1.SelectionLength; var x = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart) + 1; string s = this.richTextBox1.SelectedText; |
Löse ich nun die Funktion aus, wird der Text gelöscht und in der ersten Zeile ein < gesetzt und in der anderen ein >. Was kann ich damit nun anfangen?
Th69 - Sa 24.10.15 09:42
Um den Beitrag jetzt nicht noch länger werden zu lassen, poste ich mal die Lösung (so wie ich dies verstanden habe).
Zuersteinmal als Pseudocode:
Quelltext
1: 2: 3: 4:
| [Anwender editiert eine Zeile und bestätigt den Hotkey F1] 1. Aktuelle Zeile ermitteln und den Text in einer Variablen (s) speichern 2. Aktuelle Zeile markieren 3. Markierten Text durch "<" + s + "></" + s + ">" ersetzen |
Nun die Umsetzung:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var line = richTextBox.GetLineFromCharIndex(richTextBox.SelectionStart); var s = richTextBox.Lines[line];
var lineStart = richTextBox.GetFirstCharIndexFromLine(line); richTextBox.Select(lineStart, s.Length);
richTextBox.SelectedText = "<" + s + "></" + s + ">"; |
Also einfach nur das (sinnvolle) Kombinieren aller dir hier im Thema vorgeschlagenen Empfehlungen.
War doch gar nicht so schwer, oder?
Edit: und jetzt auch noch ein Crosspost
C# RichTextBox SelectionStart [
http://www.mycsharp.de/wbb2/thread.php?threadid=115835]
(persönlich habe ich nichts dagegen - aber einfach jetzt meine Lösung dort zu posten, ohne mir Feedback zu geben, finde ich schon unangebracht).
Den Code habe ich jetzt nicht selber ausprobiert, aber mit dem Debugger wirst du wohl leicht den Fehler finden...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!