Entwickler-Ecke

WinForms - Einfügen von Zeilenumbruch in string


drems - Do 27.09.12 22:49
Titel: Einfügen von Zeilenumbruch in string
Hallo, hätte noch mal eine Frage an euch. Ich würde gerne in einen String, der aus einer Textbox kommt, der aus ca 100-200 Zeichen besteht, spätestens an 22. Stelle ein <br /> einfügen. Falls dort kein Leerzeichen ist, soll so weit zurückgezählt werden, bis ein Leerzeichen gefunden wurde und dann dort das <br /> eingefügt werden. Ich beschäftige mich schon ewig mit dem Problem, mir fehlen aber anscheinend einfach die Kenntnisse um es zu realisieren.
Bin für Codebeispiele und sonstige Hilfe dankbar


Th69 - Fr 28.09.12 09:43

Hallo drems,

du hattest doch schon unter Zeilenumbruch Richtextbox [http://www.entwickler-ecke.de/viewtopic.php?t=110192] so eine Anfrage gestellt - vllt. solltest du demnächst mal selber etwas Code posten, damit man dir effektiver helfen kann.

Du hast aber Glück: gerade heute hat ein User auf myCSharp.de so einen Code gepostet: Einfacher word wrap Algorithmus als extension method für System.String [http://www.mycsharp.de/wbb2/thread.php?threadid=105322] (den du dann sicherlich noch ein bißchen für deine Zwecke anpassen mußt...)


drems - Fr 28.09.12 11:15

das hat mir schon mal ein bißchen geholfen, dankeschön ;-)
wenn ich dort jetzt den Beispieltext "Mein name ist Hans und ich bin vierzig Jahre alt. Mein name ist Hans und ich bin vierzig Jahre alt. Mein name ist Hans und ich bin vierzig Jahre alt. Mein name ist Hans und ich bin vierzig Jahre alt." nehme, kriege ich ja meine Liste wrappedLines mit dem Index 0-9. Wennn ich dort jetzt an jeden "Teil" ein <br /> anfügen wollte, wie müsste ich das denn machen?


Ralf Jansen - Fr 28.09.12 11:20

Über dein wrappedLines iterieren (foreach) und an jeden String deinen Wunschstring anhängen.


drems - Fr 28.09.12 11:35

Entschuldigung erstmal für die vielen Frgaen und großen Dank für die Hilfe. Wie greife ich denn genau darauf zu? Es muss ja am Ende irgendwie so aussehen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
    static class WordWrap
    {
        public static string[] WordWrapi(this string str, int width)
        {
            if (str == null)
                throw new NullReferenceException();

            List<string> wrappedLines = new List<string>();

            if (str.Length <= width)
            {
                wrappedLines.Add(str);
            }
            else
            {
                string[] words = str.Split(' ');
                StringBuilder lineBuilder = new StringBuilder();
                bool firstWord = true;
                foreach (var word in words)
                {
                    if (lineBuilder.Length + word.Length < width)
                    {
                        if (firstWord)
                        {
                            lineBuilder.Append(word);
                            firstWord = false;
                        }
                        else
                            lineBuilder.Append(" " + word);
                    }
                    else
                    {
                        wrappedLines.Add(lineBuilder.ToString());
                        lineBuilder = new StringBuilder();
                        lineBuilder.Append(word);
                    }
                }

                wrappedLines.Add(lineBuilder.ToString());
                foreach (string word in wrappedLines)
                {
                    wrappedLines.Add("");
                }
            }
            return wrappedLines.ToArray();
        }
    }

Kriege dort aber immer den Fehler:
Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Fr 28.09.12 12:26

Hallo drems,

dir scheinen noch die wesentlichsten Grundlagen zu fehlen, was die Programmieren mit Listen und Datentypen angeht.
Du willst doch an jede Zeile den Umbruch dranhängen, und nicht hinten an die Liste.

Entferne deine foreach-Schleife und ändere die wrappedLines.Add(...)-Zeilen in

C#-Quelltext
1:
wrappedLines.Add(lineBuilder.ToString() + "");                    


Ralf Jansen - Fr 28.09.12 12:36

Du willst nicht wrappedLines ändern sondern word! Also die string in der Liste ändern und nicht die Liste um einen weiteren string ergänzen.

ich würde empfehlen das in einer Schleife nach dem WordWrap Algorithmus zu machen. Das eine ist eben ein WordWrap Algorithmus das andere ein ersetze (bzw. ergänze) einen Zeilenumbruch durch <br/> Algorithmus. 2 Aufgaben die man auch getrennt behandeln sollte um sie leichter wiederverwenden zu können.


drems - Fr 28.09.12 13:12

ja, habe mir auch schon ein Buch zu C# gekauft, allerdings hat mir das bei meinem Problem nicht so arg geholfen. Hätte noch eine letzte Frage, ich kriege ja den Text, den ich aufteile über eine Textbox. Nach dem WordWrap(richtextbox1.text, 20) habe ich ein StringArray, gibt es einen einfachen Weg meinen Text aus der Textbox durch meinen anderen zu ersetzen?
Hatte es mit richtextbox1.Text += richtextbox1.Text.WordWrapi(20).ToString(); probiert, liefert allerdings nichts das, was ich suche.

ok hab selbst geschafft, vielen dank nochmal für eure hilfe. Habe es jetzt über richtextbox1.Text = ConvertArray(richtextbox1.Text.WordWrap(20)); gelöst.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Beiträge zusammengefasst