Entwickler-Ecke
Basistechnologien - SelectionStart in der RTB setzen
Csharp-programmierer - Mi 11.11.15 17:03
Titel: SelectionStart in der RTB setzen
Hallo meine Experten.
Ich habe mal wieder ein Problem, aber diesmal habe ich viele kleine Ansätze gefunden, doch es haut nicht hin. Wie ihr bereits in diesem
Thema [
http://www.entwickler-ecke.de/viewtopic.php?t=114712] entnehmen könnt, weiß ich nun wie man den Text der ausgewählten Zeile analysieren und bearbeiten kann. Das hat ja auch alles prima hingehauen.
Nun möchte ich jedoch die SelectionStart so setzen, dass der Cursor an folgender Stelle(...)eingefügt wird:
HTML-Dokument
1: 2:
| <center>...</center> <a href="">...</a> |
An der ...-Stelle soll nun der Cursor gesetzt werden. Dafür habe ich folgende Ideen:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| var line = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var lineStart = richTextBox1.GetFirstCharIndexFromLine(line); richTextBox1.Select(lineStart, s.Length); string a = this.richTextBox1.SelectedText; this.richTextBox1.SelectedText = "<" + a + "></" + a + ">"; this.richTextBox1.SelectionStart = 1 + a.Length + 3 + a.Length + 1; |
Nun wird zwar der Cursor gesetzt, jedoch kann man die Funktion nicht mehr richtig nutzen. Wenn ich jetzt z.B. in eine andere Zeile gehe, wird zwar der Text wieder eingetaggt, jedoch wird die SelectionStart nicht getsetzt. Wie kann ich die SelectionStart so setzen, dass in jeder x-beliebigen Zeile der Text eingetaggt wird und die SelectionStart korrekt gesetzt wird?
Th69 - Mi 11.11.15 17:33
Du meinst:
C#-Quelltext
1:
| richTextBox1.SelectionStart = lineStart + 2 + a.Length; |
SelectionStart ist einfach der Index vom Anfang des Textes an (unabhängig von irgendwelchen Zeilen), daher mußt du immer von Zeilenanfang (
lineStart) ausgehend die Spalte dazuaddieren.
Csharp-programmierer - Mi 11.11.15 20:17
Vielen Dank. Jetzt klappt es. Ich hätte jetzt nur noch folgendes Problem:
Quelltext
1: 2: 3: 4: 5: 6:
| 1. Benutzer gibt die Zeichen ein, welche eingetaggt werden 1.1 center u i 2. Das Programm trennt die Zeichen nach der Split-Mathode 2.1 center; u; i; 3. Das Programm taggt die Zeichen so ein, dass die Zeichen nach dem ersten nach den eingetaggten ersten Zeichen im Html Code sind 3.1 <center><u><i></i></u></center> |
Wobei die 1 nach der Hauptzahl das Beispiel angibt. Meine Idee bis jetzt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var line = i = richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var s = this.richTextBox1.Lines[line];
var lineStart = richTextBox1.GetFirstCharIndexFromLine(line); richTextBox1.Select(lineStart, s.Length); string y = this.richTextBox1.SelectedText; string[] x = y.Split(' ');
foreach (string yx in x) { this.richTextBox1.SelectionStart = i; richTextBox1.SelectedText = "<" + yx + "></" + yx + ">"; i += this.richTextBox1.SelectionStart = lineStart + 1 + yx.Length + 1; } |
Wenn ich jetzt center b i eingebe, kommt folgendes raus: <center><b><i></i></b></center>.
So weit, so gut. Doch wenn ich nun in eine andere Zeil gehe, klappt es wieder nicht. Woran liegt es nun?
Csharp-programmierer - Sa 14.11.15 21:33
Ich habe es jetzt geschafft, dass in der ersten Zeile alles prima hinhaut und, dass der Algorithmus auch nich in der zweiten, dritten usw. funktioniert. Gebe ich
center u i ein, bekomme ich
<center><u><i></i></u></center>
Doch wenn ich in der zweiten Zeile
center u i eingeben, bekomme ich
<center><u></u></center><i></i>.
Wie kann ich es so machen, dass es in allen Zeilen so funktioniert wie in der ersten?
Mein Algorithmus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var line = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var LineStart = this.richTextBox1.GetFirstCharIndexFromLine(line); var s = richTextBox1.Lines[line]; richTextBox1.Select(LineStart, s.Length); string y = this.richTextBox1.SelectedText; string[] x = y.Split(' '); foreach (string xy in x) { richTextBox1.SelectedText = "<" + xy + "></" + xy + ">"; i += LineStart + 2 + xy.Length; this.richTextBox1.SelectionStart = i; } i = 0; } |
Mfg :)
Csharp-programmierer - So 15.11.15 20:09
So meine Experten. Ich habe nun die Lösung um diesen Algorithmus gelöst. :beer:
Nach unzähligen Veruchen den Algorithmus so umzustellen, dass er in allen Zeilen gleich funktioniert und mit ganz viel Geduld und Spucke, kam nach einem langen Tag am PC sowas raus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var line = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var LineStart = this.richTextBox1.GetFirstCharIndexFromLine(line); var s = richTextBox1.Lines[line]; richTextBox1.Select(LineStart, s.Length); string y = this.richTextBox1.SelectedText; string[] x = y.Split(' '); i += LineStart; foreach (string xy in x) { richTextBox1.SelectedText = "<" + xy + "></" + xy + ">"; i += 2 + xy.Length; this.richTextBox1.SelectionStart = i; } i = 0; |
Nun funktioniert es endlich nach 3 Tagen und ich echt erleichtern.
Doch ein großes Lob geht besonders an
Th69 und
Ralf Jansen. Ohne euch hätte ich das nicht geschafft. Ein großes Lob an euch :)
Mit freundlichen Grüßen, Csharp-programmierer
Csharp-programmierer - Fr 20.11.15 21:57
Es gibt nun doch noch ein kleines Problemchen :autsch:
Wenn ich nun einen Tab setze, wird zwar der Code geschrieben, aber direkt am Anfang der Zeile. Wie bekomme ich nun den erstellten Code genau an die Position, in der der Cursor gesetzt wurde (also z.B. wenn ich TAB gedrückt habe, den Code eingegeben habe, der Code wieder an dem TAB gesetzt wird)?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var line = this.richTextBox1.GetLineFromCharIndex(this.richTextBox1.SelectionStart); var LineStart = this.richTextBox1.GetFirstCharIndexFromLine(line); var s = richTextBox1.Lines[line]; richTextBox1.Select(LineStart, s.Length); string y = this.richTextBox1.SelectedText; string yy = y.Trim(' '); string[] x = yy.Split(','); i = LineStart; foreach (string xy in x) { richTextBox1.SelectedText = "<" + xy + "></" + xy + ">"; i += 2 + xy.Length; this.richTextBox1.SelectionStart = i; } i = 0; |
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!