Tôi có một số văn bản trong RichTextBox. Văn bản này bao gồm các thẻ, ví dụ: [@TagName!]. Tôi muốn thay thế các thẻ này bằng một số dữ liệu từ cơ sở dữ liệu mà không làm mất định dạng (phông chữ, màu sắc, hình ảnh, v.v.). Tôi đã tạo phương thức:Thay thế văn bản trong 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();
}
Nó khá tốt nhưng nó xóa hình ảnh khỏi nội dung. Tôi biết rằng tôi nên sử dụng XamlPackage thay vì Xaml nhưng sau đó tôi không thể có được nó như là một văn bản đơn giản. Có giải pháp nào khác cho việc này không?
Cảm ơn câu trả lời. ;)
[EDIT: 13-02-2012 02:14 (sáng)]
giải pháp làm việc của tôi:
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);
}
Có lẽ nó không phải là tốt nhất nhưng nó hoạt động đúng.
Nó đã được giải quyết. Nhưng tôi không thể đăng giải pháp vì nó là trên máy chủ công ty mà tôi không thể truy cập nữa.
Tôi nghĩ bạn có nghĩa là XMLPackage thay vì XML. Trường hợp bạn mất hình ảnh, nó sẽ tìm thấy một trận đấu trên colname của dt.Rows [0] [colname]? – Paparazzi
No. dt.Rows [0] [colname] chỉ cho tôi các cột tên từ cơ sở dữ liệu. Hình ảnh được thêm vào RichTextBox bởi người dùng. – arche89
vì nhiều mục nhập tên, bạn sẽ cần một vòng lặp ở đâu đó, vì vậy ngay cả khi bạn đã sử dụng regex.replace thay vì khớp, bạn vẫn phải lặp qua các cột và có thể sẽ chạy thay thế vì dữ liệu mà không cần chạy. Điều đó làm cho điều này, theo ý kiến của tôi, có lẽ là câu trả lời tốt nhất có thể. Nhận các trận đấu, sau đó thay thế dữ liệu nếu cần. – Nevyn