Ho del testo in un RichTextBox. Questo testo include tag ad esempio: [@TagName!]. Voglio sostituire questi tag con alcuni dati da un database senza perdere la formattazione (caratteri, colori, immagini, ecc.). Ho creato un metodo:Sostituisci testo in XamlPackage
void ReplaceTagsWithData(FlowDocument doc)
{
FileStream fs = new FileStream("tmp.xml", FileMode.Create);
TextRange trTextRange =
new TextRange(doc.ContentStart, doc.ContentEnd);
trTextRange.Save(fs, DataFormats.Xaml);
fs.Dispose();
fs.Close();
StreamReader sr = new StreamReader("tmp.xml");
string rtbContent = sr.ReadToEnd();
MatchCollection mColl =
Regex.Matches(rtbContent,
string.Format(@"\{0}+[a-zA-Z]+{1}",
prefix,
postfix));
foreach (Match m in mColl)
{
string colname =
m.Value.Substring(prefix.Length,
(int)(m.Value.Length - (prefix.Length + postfix.Length)));
rtbContent = rtbContent.Replace(m.Value.ToString(),
dt.Rows[0][colname].ToString());
}
rtbEdit.Document =
new FlowDocument(
(Section)XamlReader.Load(
XmlReader.Create(new StringReader(rtbContent))));
sr.Dispose();
sr.Close();
}
È abbastanza buono ma rimuove le immagini dal contenuto. So che dovrei usare XamlPackage invece di Xaml ma non riesco a ottenerlo come testo normale. C'è qualche altra soluzione per questo?
Grazie per le risposte. ;)
[EDIT: 13-02-2012 02:14 (am)]
La mia soluzione di lavoro:
void ReplaceTagsWithData(RichTextBox rtb)
{
FlowDocument doc = rtb.Document;
FileStream fs = new FileStream("tmp", FileMode.Create);
TextRange trTextRange = new TextRange(doc.ContentStart, doc.ContentEnd);
trTextRange.Save(fs, DataFormats.Rtf);
fs.Dispose();
fs.Close();
StreamReader sr = new StreamReader("tmp");
string rtbContent = sr.ReadToEnd();
sr.Dispose();
sr.Close();
MatchCollection mColl =
Regex.Matches(rtbContent,
string.Format(@"\{0}+[a-zA-Z]+{1}",
prefix,
postfix));
foreach (Match m in mColl)
{
string colname =
m.Value.Substring(prefix.Length,
(int)(m.Value.Length - (prefix.Length + postfix.Length)));
rtbContent = rtbContent.Replace(m.Value.ToString(),
dt.Rows[0][colname].ToString());
}
MemoryStream stream =
new MemoryStream(ASCIIEncoding.Default.GetBytes(rtbContent));
rtb.SelectAll();
rtb.Selection.Load(stream, DataFormats.Rtf);
}
forse non è la migliore, ma che sta funzionando correttamente.
È stato risolto. Ma non posso pubblicare la soluzione perché è sul server aziendale a cui non posso accedere più.
Penso che tu intenda XMLPackage anziché XML. Dove perdi l'immagine trova una corrispondenza sul nome di dt.Rows [0] [colname]? – Paparazzi
No. dt.Rows [0] [nome_colonna] restituisce solo i nomi delle colonne dal database. Le immagini vengono aggiunte in RichTextBox dall'utente. – arche89
a causa delle voci multiple del colname, avresti bisogno di un loop lì da qualche parte, quindi anche se usassi regex.replace invece di match, dovresti comunque eseguire il looping tra le colonne, e potrebbe finire per eseguire sostituzioni inutili a causa dei dati non ha bisogno di correre Ciò rende questa, a mio avviso, probabilmente la migliore risposta possibile. Ottieni le partite, quindi sostituisci i dati secondo necessità. – Nevyn