it4baer
Goto Top

WPF CSharp RichTextBox ersetze werte

Hi,

ich will mit WPF eine Richtextbox einlesen und diese mit Platzhaltern versehen, die Platzhalter möchte ich im nachhinein ersetzen...

=> das ganze soll praktisch temporär eingelesen werden und dann je nach Vorgabe anders ersetzt werden (vergleichbar mit Serienbriefen).

wie kann ich werte in einer Richtextbox ersetzen?

z.B.
Sehr geehrte{0} {1},

...

ersetzt wird dann
{0} => " Frau Müller"
oder
{1} => "r Herr Maier"

Vielen Dank

Content-ID: 365201

Url: https://administrator.de/forum/wpf-csharp-richtextbox-ersetze-werte-365201.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

135333
135333 19.02.2018 aktualisiert um 11:13:32 Uhr
Goto Top
string result = String.Format("Sehr geehrte{0} {1}", var1, var2);  
Gruß Snap

p.s. wenns mehr wird mit den Ersetzungen denke mal über ein Replace mit einer Hashtable von Platzhaltern nach!
it4baer
it4baer 19.02.2018 um 11:27:26 Uhr
Goto Top
nun, evtl. habe ich mich falsch ausgedrückt... der "replace" an sich ist nicht mein Problem... mein Problem ist der "Zugriff" auf die RichTextBox...

ich habe den Content ja fest in der Box stehen und jetzt will ich Verarbeitung starten und er arbeitet eine "Tabelle" ab.
Aber in meiner RichTextBox steht ja nicht nur Text sondern auch Formatierungen und Tabellen...
135333
135333 19.02.2018 aktualisiert um 11:37:32 Uhr
Goto Top
mein Problem ist der "Zugriff" auf die RichTextBox...
string _Text = new TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd).Text;
https://stackoverflow.com/questions/13041350/automatic-replacement-of-te ...
it4baer
it4baer 19.02.2018 um 11:58:28 Uhr
Goto Top
diese Lösung habe ich bereits gefunden... aber da geht natürlich meine Formatierung drauf... <- oder ich ersetze direkt in der Textbox und dann gehen meine Platzhalter drauf
colinardo
Lösung colinardo 19.02.2018 aktualisiert um 12:17:32 Uhr
Goto Top
Servus @it4baer .
// Dictionary mit Ersetzungen
Dictionary<string,string> Replacements = new Dictionary<string,string>();
Replacements.Add("<search1>","<replacement1>");  
Replacements.Add("<search2>","<replacement2>");  

// Textrange holen
TextRange r = new TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd)
string strRTF;

// RTF Stream extrahieren
using (MemoryStream ms = new MemoryStream()) {
    r.Save(ms,DataFormats.Rtf);
   strRTF = Encoding.UTF8.GetString(ms.ToArray());
}

// Ersetzungen vornehmen
foreach (KeyValuePair<string,string> entry in Replacements) {
    strRTF = strRTF.Replace(entry.Key, entry.Value);
}

// String in Textrange zurückschreiben
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(strRTF))) {
    r.Load(ms, DataFormats.Rtf);
}
Grüße Uwe
it4baer
it4baer 19.02.2018 um 16:27:02 Uhr
Goto Top
Hallo Uwe,

in Zeile 18 werden beim Replace einige Umlaute nicht richtig verarbeitet... wenn ich die Daten weitergebe an z.B. einen Outlook Emailbody werden zwar die Umlaute aus der RchTextBox richtig angezeigt, die neu eingefügten Umlaute aber nicht...
vermutlich schafft auch das "GetBytes" dass dann nicht richtig zu verarbeiten...

Wie kann ich sicherstellen, dass die Umlaute richtig dargestellt werden?

Vielen Dank
colinardo
Lösung colinardo 19.02.2018 aktualisiert um 16:44:33 Uhr
Goto Top
Dein Encoding sollte passen. Zu siehst ja in Zeile 13 und 22 das ich hier UTF8 nutze, also wird das Ergebnis im RTF-Feld letztendlich UTF8 kodiert sein. Damit das in Outlook richtig dargestellt wird muss in Outlook das Encoding ebenfalls passen.
Per Default ist dies "Westeuropäisch ISO". Das lässt sich in den Outlook-Eigenschaften anpassen:
Optionen > Erweitert > Internationale Optionen > "Bevorzugte Kodierung für ausgehende Nachrichten" und "UTF-8 für das Mailto Protokoll zulassen."

Statt UTF-8 kannst du natürlich auch ANSI im Code nutzen mit dem Namespace Encoding.Default.GetBytes().