Entwickler-Ecke
Basistechnologien - Textbox Variablen ersetzen + leere Zeilen entfernen
DarkStaRX - Di 22.01.13 21:56
Titel: Textbox Variablen ersetzen + leere Zeilen entfernen
Guten Abend Coder,
ich habe folgendes Problem wo ich nicht weiß wie ich dieses zu lösen habe und zwar, habe ich eine Textbox die gefüllt wird mit erstellten Variablen das z.B. so aussieht:
[TEXTBOX]
%THEMA%
%DEIN NAME%
%BESCHREIBUNG%
%GRUß%
[/TEXTBOX-ENDE]
Dies soll als eine Art Vorlage für Benutzer sein die diese entsprechend verändern / anpassen dürfen.
Anschließen werden andere TextBox ausgefüllt und bei einem Klick auf den Button werden dann die Texte der anderen Textboxen mit den Variablen erstetzt.
Nun zum Problem, falls z.B. die TextBox für das Thema leer bleibt und er auf den Button klickt sind die ersten 3 Zeilen leere Zeilen und sollen entfernt werden.
Das gleiche gilt wenn z.B. Thema und Name ausgefüllt werden, Beschreibung NICHT und Gruß wieder, das alle leeren Zeilen (nach %BESCHREIBUNG) + die Variable %BESCHREIBUNG% entfernt werden.
Ist dies ohne weiteres möglich oder wird es kompliziert?
MFG
papa69 - Di 22.01.13 22:45
hallo DarkStarX,
ein "echtes" Problem ist das eigentlich nicht:
zu 1.: Im Designer kannst du ja deine Textboxen mit dem gewünschten Text belegen. (Es gibt auch eine spezielle Methode, die diesen Text auch (blau) hinterlegt anzeigt, der dann verschwindet, sobald man mit der Texteingabe startet --> jedoch fällt mir kongret der Name dafür nicht ein --> sollte eigentlich
SelectAll sein)
Nachdem du deine Texte versendet hast, löscht du deine 1.Textboxen wieder und füllst sie mit den Default-Werten...
zu 2.: Tipp: String.Trim
http://msdn.microsoft.com/de-de/library/kxbw3kwc%28v=vs.80%29.aspx
EDIT: Ich bin jetzt davon ausgegangen, dass du für jedes Textfeld eine eigene Textbox hast...
Palladin007 - Di 22.01.13 23:10
So ganz verstehe ich jetzt nicht, was du geplant hast.
Ich versuch meinen Gedankengang mal deutlich zu machen:
Du hast eine große Textbox mit den Angaben, die als Standard zu sehen sind und die der Nutzer dann ändern kann/soll.
Wenn die Eingabe nun weiter verarbeitet wird, dann sind noch einige leere Zeilen zwischen den Angaben und die sollen weg.
Wenn ich das so richtig verstanden habe, dann fällt mir als erstes ein:
Warum eine große Textbox und nicht mehrere Einzelne?
Wenn das aus unerfindlichen gründen nicht geht, dann würde ich die Zeilen auseinander trennen. das geht mit der Split-Methode: string[] lines = textBox1.Text.Split('\n');
Und damit kannst du dann den Rest machen.
Da eine TextBox für jede Zeile folgendes schreibt: \r\n musst du das auch beachten. Wenn du also bei \n splitten lässt, ist am Ende der ersten Zeile noch ein \r zu finden, aber das lässt sich ja ganz einfach mit Substring(int, int) entfernen.
Und die einzelnen Zeilen wirfst du dann raus, indem du alle durch läufst und prüfst. Wenn da nur ein \r drin steht, dann brauchst du die Zeile nicht und sie kann ignoriert werden. Wenn Text drin steht oder auch Leerzeichen, das ist deine Entscheidung) dann fügst du die Zeile in eine Liste, wo sie dann auf die weitere Verarbeitung warten kann.
DarkStaRX - Mi 23.01.13 00:07
Also die "große" TextBox ist in einer anderen Form Namen "Einstellungen".
Diese Box dient als Vorlage die der User nach Geschmack ändern kann. Deswegen stehen da auch Variablen drin die später bei dem Button klick entsprechend der ausgefüllten (mehreren) Textboxen ersetzt werden.
Also
if (TextBox deinname.Text != "")
{
großeTextbox.Text = großeTextbox.Replace("%DEIN NAME%",deinname.Text);
}
else
{
//HIER JETZT DAS PROBLEM
Von %DEIN NAME% bis zur nächsten Varieble (nicht fest definiert, in diesem Beispiel wäre das %BESCHREIBUNG%) alle Zeilenumbrüche entfernen
}
Nur weiß ich nicht wie das genau klappen soll, hoffe das war jetzt ein wenig besser Erklärt :D
Palladin007 - Mi 23.01.13 00:16
Nagut, ich weiß nicht so ganz, wie sinnvoll das sein soll, aber das ist ja nicht Thema ^^
Wie du alle Zeilenumbrüche entfernen kannst, hatte ich ja vorher schon erklärt, nämlich mit der Split-Methode.
Was mir da auch gerade einfällt, es gibt noch die Klasse
TextReader [
http://msdn.microsoft.com/de-de/library/system.io.textreader.aspx], mit der du den Text direkt zeilenweise lesen kannst.
Dann musst du nur noch überprüfen, ob in der gerade ausgewählten Zeile Text liegt oder nicht und entsprechend die Zeile weiter verarbeiten oder ignorieren.
DarkStaRX - Mi 23.01.13 00:28
Naja wenn dann z.B. %DEIN NAME% und %BESCHREIBUNG% = "" sind
Ist die Ausgabe so:
[TEXTBOX]
%THEMA%
%GRUß%
[/TEXTBOX-ENDE]
Rauskommen soll aber nur das:
[TEXTBOX]
%THEMA%
%GRUß%
[/TEXTBOX-ENDE]
Bei meinem Programm sind weit mehrere Variablen, diese waren hier nur als Beispiel gedacht.
Palladin007 - Mi 23.01.13 00:40
Ja dann mach das doch, wie ich gesagt habe.
Lass dir alle Zeilen geben und sortiere dann alle leeren Zeilen aus.
Wo ist da noch das Problem?
DarkStaRX - Mi 23.01.13 00:58
DarkStaRX hat folgendes geschrieben : |
Naja wenn dann z.B. %DEIN NAME% und %BESCHREIBUNG% = "" sind
Ist die Ausgabe so:
[TEXTBOX]
%THEMA%
%GRUß%
[/TEXTBOX-ENDE]
Rauskommen soll aber nur das:
[TEXTBOX]
%THEMA%
%GRUß%
[/TEXTBOX-ENDE]
Bei meinem Programm sind weit mehrere Variablen, diese waren hier nur als Beispiel gedacht. |
Palladin007 hat folgendes geschrieben : |
Ja dann mach das doch, wie ich gesagt habe.
Lass dir alle Zeilen geben und sortiere dann alle leeren Zeilen aus.
Wo ist da noch das Problem? |
Dann würde er ja alle entfernen und das Ergebnis würde so sein:
[TEXTBOX]
%THEMA%
%GRUß%
[/TEXTBOX-ENDE]
Eine Formatierung sollte ja schon da sein
Palladin007 - Mi 23.01.13 01:43
Du hast ein Array, das besteht aus den einzelnen Zeilen, die du haben willst und ein paar Zeilen, die leer sind.
Nun willst du da von den leeren Zeilen einige raus werfen, aber nicht alle.
Wo liegt da das Problem? Dann lässt du beim Löschen halt Zwei aus, oder du löschst alle Zeilen und fügst noch ein paar wieder rein, wie es eben grad passt.
Nimmst du eine simple Schleife und läufst durch die Zeilen. Die vollen Zeilen kann man ja gleich in die "Output-Liste" schieben. Die leeren Zeilen eben nicht, wenn aber noch welche gebraucht werden, dann schiebst du halt manuell noch leere Zeilen ein, oder zählst so viele aus dem Zeilen-Array raus, wie du haben willst.
So schwer ist das nicht :D
Du hast alles, was du brauchst, um sie selber zu finden plus eine ausreichende Beschreibung, wie das arbeiten kann ^^
Eine fertige Lösung kriegst du von mir nicht :P
DarkStaRX - Mi 23.01.13 14:23
Ja für die Hilfe bedanke ich mich natürlich und eine fertige Lösung möchte ich auch garnicht haben, will ja schließlich daraus was lernen.
Das Ding ist nur, das ich nichts manuell später hinzufügen möchte sondern den "Endcode" einfach kopieren kann und das wars.
Ich werds mal versuchen und schauen wie ich das hinbekomme, auf jeden Fall ein DANKE für die Super schnellen und hilfreichen Antworten!
Tolles Forum hier =)
C# - Mi 23.01.13 15:16
Machs doch so dass du die Leerzeilen nicht in die Vorlage machst, sondern in die einzelnen Boxen.
Also so:
[TEXTBOX]
%THEMA%
%DEIN NAME%
%BESCHREIBUNG%
%GRUß%
[/TEXTBOX-ENDE]
So und wenn du jetzt die einzelnen Teile aus anderen TextBox-Controls holst machst du einfach sowas:
C#-Quelltext
1:
| boxZusammenfassung.AppendText(boxThema.Text + Environment.NewLine); |
oder
C#-Quelltext
1:
| boxZusammenfassung.Text = boxZusammenfassung.Text.Replace("%THEMA%", boxThema.Text + Environment.NewLine); |
Kannst ja auch noch FormatString benutzen, bei mehreren Zeilen z.B.:
C#-Quelltext
1:
| boxZusammenfassung.AppendText(String.Format("{0}{1}{1}{1}", boxThema.Text, Environment.NewLine)); |
Und wenn du die %Variablen% bei der TextBox drinnen lässt und die entsprechende TextBox leer ist kannste das so machen:
C#-Quelltext
1: 2:
| string s = String.IsNullOrEmpty(boxThema.Text) ? "" : boxThema.Text + Environment.NewLine; boxZusammenfassung.AppendText(s); |
DarkStaRX - Mi 23.01.13 16:25
Hey C#,
Das wäre auch eine Möglichkeit, mein Plan war es nur das ich den User selbst entscheiden lasse wie er seine Vorlage gestaltet, deswegen wollte ich solche Abstände nicht in dem Replace hinzufügen.
Aber wie es aussieht komm ich irgendwie nicht drauf wie ich das Perfekt lösen kann.
Palladin007 - Mi 23.01.13 17:22
Ach der User soll das selber fest legen können, sag das doch :D
Das ist eigentlich auch gar nicht so schwer ^^
Die wahrscheinlich einfachste Lösung wäre, wenn du wie oben beschrieben, alle leeren Zeilen entfernst und dann die gewünschte Menge von leeren Zeilen wieder hinzu fügst.
Schneller wäre da vermutlich, wenn du beim löschen der Zeilen so viele aus lässt, wie der Nutzer haben will und wenn das zu wenig sind, fügst du noch welche hinzu.
Dabei musst du eigentlich nur wissen, dass bei Windows eine neue Zeile immer durch "\r\n" definiert ist.
Was ich da machen würde, ist folgendes:
Ich laufe durch die Zeilen. Wie das geht, habe ich erklärt.
Ich schaue mir jede Zeile einzeln an, wenn der Text drin steht, dann verarbeite ich ihn entsprechend und schiebe ihn fertig verarbeitet in eine neue Liste. Ab dem ersten "Variablen-Text" beginne ich dann auch, die leeren Zeilen zu zählen und sobald die gezählte Anzahl über der ausgewählten Menge geht, schiebe ich die leeren Zeilen nicht mehr in die neue Liste. Wenn ich dann auf eine weitere Zeile mit Text stoße und die gewollte Anzahl leerer Zeilen ist nicht erreicht, dann erzeuge ich in einer weiteren Schleife genau so viele leere Zeilen, wie ich brauche und füge sie der Liste hinzu.
Wenn ich danach mit der nächsten Text-Zeile weiter mache, beginnt das Ganze von vorne.
Wenn du das jetzt noch mit einem StringBuilder-Objekt machst, hast du die Ressourcen sparenste Variante, die mir einfällt.
C# - Mi 23.01.13 17:31
Ich würde aber Empfehlen Environment.NewLine zu benutzen, da "\r\n" - zumindest bei mir - auch mal 2 neue Zeilen verursachen kann.
Und "\n" reicht bei mir für eine neue Zeile, bei meinem anderen PC allerdings nicht :D.
Deshalb Environment.NewLine, dann bist du auf der sicheren Seite.
Palladin007 - Mi 23.01.13 18:08
Das stimmt, daran hab ich jetzt nicht gedacht.
Bei Windows ist das zumindest die neue Zeile, aber es gibt ja noch andere Plattformen und da ist das anders. ^^
C# - Do 24.01.13 08:30
Also bei meinem Win7 reicht ein einfaches "\n" für eine neue Zeile. Ich meine sogar in Erinnerung zu haben, dass bei "\r\n" zwei neue Zeilen hinzu kommen (kann mich aber auch irren). Mein Windows ist hald iwi komisch :D
Palladin007 - Do 24.01.13 13:54
Na dann mach doch mal folgendes:
Erstelle eine mehrzeilige Textbox, schreibe oben ein Wort, dann drücke so lange ENTER, wie du willst und dann wieder ein Wort.
Dann drücke einen Button, der nur dafür da ist, die Anwendung anzuhalten. Im Innern des Events hab ich dann einfach einen Haltepunkt gesetzt um dann den Wert zu sehen, der in der Eigenschaft textBox1.Text steht und da steht dann bei insgesamt 7 Zeilen und 5 leeren Zeilen folgendes:
"Anfang\r\n\r\n\r\n\r\n\r\nEnde"
Hab ich selber auch getestet, weil ich mir auch nicht mehr sicher war.
Du kannst ja auch mal die Eigenschaft abändern. Bei Visual Studio geht das glaube ich, auch wenn ich es noch nie genutzt hab. :D
Aber du kannst ja einfach mal \r\n einfügen und ich bin mir sicher, dass nur eine Zeile dazu kommt. ^^
C# - Do 24.01.13 16:56
Gebe mich geschlagen :D Bei dem PC an dem ich jetzt bin (bei der Arbeit) geht es nur mit "\r\n". Bei allem anderen erhalte ich Müll. ABER ich bin mir absolut Sicher, dass bei meinem PC zu Hause das ganze auch mit "\n" oder "\r" geht, weil ich da bei meinen Programmen oft aus Faulheit einfach "\n" mache, statt Environment.NewLine.
Palladin007 - Do 24.01.13 19:09
Ja. das geht mit beidem, das weiß ich, aber dennoch ist es als \r\n definiert :P
Warum weiß ich allerdings auch nicht. \n ist ja definiert als die neue Zeile und \r als Wagenrücklauf, wenn ich mich nicht irre, aber was das nun sein soll, weiß ich auch nicht. :oops:
DarkStaRX - Do 24.01.13 19:24
Sorry das ich gestern nicht geantwortet habe, habe derzeit noch andere Sachen zu erledigen.
Also ich bedanke mir erstmal für die Hilfe!
Eine Lösung habe ich aber bis dato noch nicht erreicht und denke mir mal das ich das einfach so lasse wie es ist das da dann einfach paar leere Felder sind :D
MFG
DarkStaR
Palladin007 - Do 24.01.13 20:58
Also das halte ich für die falsche Herangehensweise ^^
Ich weiß nicht, wie du Programmieren gelernt hast, aber ohne Lehrer ist das schwer. Ich hab die Erfahrung gemacht, dass das nur funktioniert, wenn man nicht auf gibt, bis ein Problem gelöst ist oder klar ist, warum es nicht gelöst werden kann.
Poste doch mal deinen bisherigen Code, dann können wir mal drüber schauen und Tipps geben, wo der Fehler liegen könnte.
C# - Fr 25.01.13 09:53
Alsoooooo. Probiers mal so:
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:
| StringBuilder stringBuilder = new StringBuilder();
string lastLine = "blabla"; foreach (string line in boxZusammenfassung.Lines) { string s = line.Trim();
if (!String.IsNullOrEmpty(s)) {
if (s.Contains("%THEMA%")) s = s.Replace("%THEMA%", boxThema.Text.Trim()); if (String.IsNullOrEmpty(lastLine)) stringBuilder.AppendLine(); stringBuilder.AppendLine(s); } lastLine = s; }
boxZusammenfassung.Text = stringBuilder.ToString(); |
/// EDIT
Sry hab 2. Seite nicht gesehen.
Untersuch mal das Schnipsel und guck ob du alles begriffen hast.
DarkStaRX - Sa 26.01.13 19:09
C# hat folgendes geschrieben : |
Alsoooooo. Probiers mal so:
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:
| StringBuilder stringBuilder = new StringBuilder();
string lastLine = "blabla"; foreach (string line in boxZusammenfassung.Lines) { string s = line.Trim();
if (!String.IsNullOrEmpty(s)) {
if (s.Contains("%THEMA%")) s = s.Replace("%THEMA%", boxThema.Text.Trim()); if (String.IsNullOrEmpty(lastLine)) stringBuilder.AppendLine(); stringBuilder.AppendLine(s); } lastLine = s; }
boxZusammenfassung.Text = stringBuilder.ToString(); |
/// EDIT
Sry hab 2. Seite nicht gesehen.
Untersuch mal das Schnipsel und guck ob du alles begriffen hast. |
Man erstellt einen StringBuilder;
Ein string LastLine... mit irgendeinem Text
Dann kommt die foreach Schleife, dort speichert man in der String Variable "s" die Zeile der Textbox (Ergebnis) und entfernt leerzeichen
Dann prüft man ob die Zeile != Nichts enthält
Wenn das zutrifft prüft man ob "s" die Variable "%THEMA% enthält und ersetzt dann die Variable mit dem Text aus der Textbox? (Textbox ist ja leer also wird dann wohl "" ersetzt?)
Wenn "LastLine" nichts enthält wird dem StringBuilder eine zeile hinzugefügt und der ersetzte Text....
Anschließen wird der neue Text vom StringBuilder in die TextBox gesetzt.
Aber irgendwie klingt mir das nicht ganz nach meinem Ergebnis das ich erzielen möchte.
Im Anhang habe ich das Programm mal gebaut und mein derzeitiger Code ist dort.
Sieht eigentlich auch nur so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if (!String.IsNullOrEmpty(txt_thema.Text)) { textvorlage.Text = textvorlage.Text.Replace("%THEMA%", txt_thema.Text); } else { textvorlage.Text = textvorlage.Text.Replace("%THEMA%", ""); } |
C# - So 27.01.13 13:52
Also 1. Wenn die entsprechende Textbox leer ist, wird %THEMA% einfach durch "" ersetzt, also KEIN Leerzeichen und nix.
2. was soll das mit der Textbox textvorlage? Die macht überhaupt keinen Sinn. Da kannste n einfachen
string nehmen.
3. Dieser string würde überflüssig werden.
Ich habe einen kleinen Fehler bei meinem Code entdeckt.
Hier der funktionierende Code:
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:
| StringBuilder stringBuilder = new StringBuilder();
string lastLine = "blabla"; foreach (string line in boxZusammenfassung.Lines) { string s = line.Trim(); if (s.Contains("%THEMA%")) s = s.Replace("%THEMA%", boxThema.Text.Trim()); if (!String.IsNullOrEmpty(s)) { if (String.IsNullOrEmpty(lastLine)) stringBuilder.AppendLine(); stringBuilder.AppendLine(s); } lastLine = s; }
boxZusammenfassung.Text = stringBuilder.ToString(); |
Ich habe dein Projekt so bearbeitet, das dieser Teil funktioniert.
DarkStaRX - So 27.01.13 20:31
Die Textbox Vorlage dient dazu jedem Benutzer der das Programm benutzt sein eigene Vorlage zu erstellen, auch mit unterschiedlichen Abständen zwischen den Variablen.
Bei dem Programm das du im Anhang gepostet hast ist am Ende (Ergebnis Form) Nach jedem Text nur 1 Zeilenumbruch was ja laut der Vorlage bei manchen nicht so ist da es 2 sind
C# - Mo 28.01.13 18:39
Achso du willst auch mehr Leerzeilen haben. Das ist nicht sonderlich schwer. Kannste ohne großen Ärger mein Schnipsel ändern. Ich denke da kommste schon von alleine drauf.
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!