Autor |
Beitrag |
DarkStaRX
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: Di 22.01.13 21:56
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
      
Beiträge: 79
Erhaltene Danke: 23
Win 10, Ubuntu
C#, Java, C
|
Verfasst: 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 msdn.microsoft.com/d...wc%28v=vs.80%29.aspx
EDIT: Ich bin jetzt davon ausgegangen, dass du für jedes Textfeld eine eigene Textbox hast...
_________________ Daniel Bauer
... fatal ist nur, wenn sich das Licht am Ende des Tunnels als entgegenkommender ICE entpuppt ...
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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 
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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, 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 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
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 
|
|
DarkStaRX 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: 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); |
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
DarkStaRX 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 23.01.13 17:22
Ach der User soll das selber fest legen können, sag das doch
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#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: 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  .
Deshalb Environment.NewLine, dann bist du auf der sicheren Seite.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: 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 
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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.
Aber du kannst ja einfach mal \r\n einfügen und ich bin mir sicher, dass nur eine Zeile dazu kommt. ^^
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Do 24.01.13 16:56
Gebe mich geschlagen  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.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 24.01.13 19:09
Ja. das geht mit beidem, das weiß ich, aber dennoch ist es als \r\n definiert
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. 
|
|
DarkStaRX 
      
Beiträge: 28
Erhaltene Danke: 3
|
Verfasst: 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
MFG
DarkStaR
|
|
|