2014-03-30 29 views
0

有没有什么办法可以在winforms中排序行richtextbox保存RTF格式?在winforms中排序richtextbox保留RTF格式

var lines = edit.Lines.OrderBy(s => s); 
edit.Lines = lines.ToArray(); 

做得很好,但很明显,失去了任何RTF格式。

我有稍微改变TAW的片段: 1.添加“独特”可能打破的第一行格式化 2.除了“\看齐”的标签也有“\ PARD”

这里是一个段(再次感谢TAW!):

private void cmdSort_Click(object sender, EventArgs e) 
    { 
     const string PARD = "\\pard"; 
     var pard = Guid.NewGuid().ToString(); 

     var pos1 = edit.Rtf.IndexOf(PARD, StringComparison.Ordinal) + PARD.Length; 
     if (pos1 < 0) return; 
     var header = edit.Rtf.Substring(0, pos1); 
     var body = edit.Rtf.Substring(pos1); 
     body = body.Replace("\\pard", pard); 
     var lines = body.Split(new[] { "\\par" }, StringSplitOptions.None); 
     var lastFormat = ""; 
     var sb = new StringBuilder(); 
     var rtfLines = new SortedList<string, string>(); 
     foreach (var line in lines) 
     { 
      var ln = line.Replace(pard, "\\pard"); 
      var temp = ln.Replace("\r\n", "").Trim(); 
      if (temp.Length > 0 && temp[0] != '\\') 
      { 
       rtfLines.Add(temp.Trim(), lastFormat + " " + ln); 
      } 
      else 
      { 
       var pos2 = temp.IndexOf(' '); 
       if (pos2 < 0) 
       { 
        rtfLines.Add(temp.Trim(), ln); 
       } 
       else 
       { 
        rtfLines.Add(temp.Substring(pos2).Trim(), ln); 
        lastFormat = temp.Substring(0, pos2); 
       } 
      } 
     } 
     foreach (var key in rtfLines.Keys.Where(key => key != "}")) 
     { 
      sb.Append(rtfLines[key] + "\\par"); 
     } 
     edit.Rtf = header + sb; 
    } 

回答

0

下面的代码片段,似乎工作,如果该文件既没有图像也没有表嵌入..

它使用两个RTF框。在我的测试中,他们排序好,并保持所有格式不变。

private void button4_Click(object sender, EventArgs e) 
    { 
     string unique = Guid.NewGuid().ToString() ; 

     richTextBox1.SelectionStart = 0; 
     richTextBox1.SelectionLength = 0; 
     richTextBox1.SelectedText = unique; 
     int pos1 = richTextBox1.Rtf.IndexOf(unique); 

     if (pos1 >= 0) 
     { 
      string header = richTextBox1.Rtf.Substring(0, pos1); 
      string header1 = ""; 
      string header2 = ""; 
      int pos0 = header.LastIndexOf('}') + 1; 
      if (pos0 > 1) { header1 = header.Substring(0, pos0); header2 = header.Substring(pos0); } 
      // after the header comes a string of formats to start the document 
      string[] formats = header2.Split('\\'); 
      string firstFormat = ""; 
      string lastFormat = ""; 
      // we extract a few important character formats (bold, italic, underline, font, color) 
      // to keep with the first line which will be sorted away 
      // the lastFormat variable holds the last formatting encountered 
      // so we can add it to all lines without formatting 
      // (and of course we are really talking about paragraphs) 
      foreach (string fmt in formats) 
       if (fmt[0]=='b' || ("cfiu".IndexOf(fmt[0]) >= 0 && fmt.Substring(0,2)!="uc")) 
         lastFormat += "\\" + fmt; else firstFormat += "\\" + fmt; 
      // add the rest to the header 
      header = header1 + firstFormat; 
      // now we remove our marker from the body and split it into paragraphs 
      string body = richTextBox1.Rtf.Substring(pos1); 
      string[] lines = body.Replace(unique, "").Split(new string[] { "\\par" }, StringSplitOptions.None); 

      StringBuilder sb = new StringBuilder(); 
      // the soteredlist will contain the unformatted text as key and the formatted one as valaue 
      SortedList<string, string> rtfLines = new SortedList<string, string>(); 
      foreach (string line in lines) 
       { 
        // cleanup 
        string line_ = line.Replace("\r\n", "").Trim(); 
        if (line_[0] != '\\') rtfLines.Add(line_, lastFormat + " " + line); 
        else 
        { 
         int pos2 = line_.IndexOf(' '); 
         if (pos2 < 0) rtfLines.Add(line_, line); 
         else 
         { 
          rtfLines.Add(line_.Substring(pos2).Trim(), line); 
          lastFormat = line_.Substring(0, pos2); 
         } 
        } 

       } 
      foreach (string key in rtfLines.Keys) if (key != "}") sb.Append(rtfLines[key] + "\\par"); 
      richTextBox2.Rtf = header + sb.ToString(); 
     } 

当然,这是不是真的q & d,未准备好严重的生产;但它看起来像一个开始。

编辑2:我更改了代码以修复第一行格式的错误并添加了一些注释。这应该工作好很多,但仍然是一个必须适应真正的输入文件的破解..

+0

真的看起来像开始,谢谢!如果我可以 - 我没有足够的声望,我检查了这个功能是否有用:( – dedpichto

+0

检查一下,如果它确实对您有用,您可以'接受'它作为答案。要做到这一点,您不需要任何声誉;事实上这样做会让你获益,我想两点。 – TaW

0

RichTextBox中有一个属性Rtf将保持RTF格式。

[BrowsableAttribute(false)] 
public string Rtf { get; set; } 
+0

Rtf属性只是一个字符串包括Rtf格式标记。我已经想过把它分成“\ par”标签,但看起来我真的是一团糟。 – dedpichto

+0

乱七八糟的数量将取决于您拥有的格式数量。如果没有嵌入图像,它实际上可能相当简单,请参阅上面的我的建议。 – TaW