2012-02-10 43 views
41

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.

+0

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

+0

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

+0

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

Trả lời

-2

Thử sử dụng phương thức Regex.Replace. Bạn có thể tìm thấy tham chiếu đến phương thức trong MSDN http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx

+7

Chà ... nghiêm túc? Sử dụng Regex để thao tác XML ??? –

+2

Xin đừng cố lừa dối những người có câu trả lời vô nghĩa – Suits999

1

Bạn có thể sử dụng Dao cạo để làm bất cứ điều gì bạn muốn trong đối tượng khuôn mẫu. Bạn có thể tải xuống từ nuget (http://www.nuget.org/packages/RazorEngine) và không có bất kỳ cấu hình thiết lập nào, bạn có thể sử dụng cú pháp Razor để thực hiện việc này. Ví dụ mẫu của bạn có thể là thế này:

<Window x:Class="<class>" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="@Model.Title" 
     Icon="@Model.Icon"> 
    <Grid>  
    </Grid> 
</Window> 

Lưu ý: @ Model.Title và @ Model.Icon thats đến từ Razor

Trên thực tế tôi sử dụng RazorEngine cho tất cả các nhiệm vụ khuôn mẫu của tôi: Email, Tạo báo cáo khi đang bay (rdlc), v.v ...

0

Regex bạn đang sử dụng tham lam sao cho phù hợp với mọi thứ từ đầu một mã thông báo đến hết mã thông báo sau. Thay đổi nó thành @"\{0}[a-zA-Z]+?{1}" để có kết quả phù hợp hơn.

Ngoài ra, bằng cách sử dụng quá tải Regex.Replace phải mất một lambda sẽ được mã sạch hơn.

Các vấn đề liên quan