【问题标题】:Problem loading RTF file into windows richTextBox将 RTF 文件加载到 Windows RichTextBox 时出现问题
【发布时间】:2010-05-01 14:23:56
【问题描述】:

我正在尝试将文件加载到 Windows froms(vs 2010)richTextBox 中,但只有文件的第一行正在加载。我正在使用:

        // Create an OpenFileDialog to request a file to open.
        OpenFileDialog openFile1 = new OpenFileDialog();

        // Initialize the OpenFileDialog to look for RTF files.
        openFile1.DefaultExt = "*.rtf";
        openFile1.Filter = "RTF Files|*.rtf";

        // Determine whether the user selected a file from the OpenFileDialog.
        if (openFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            // Load the contents of the file into the RichTextBox.
            rtbTest.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);
        }

我尝试使用在 word 或 word pad 中创建的 rtf 文件,并尝试将 .cs 文件另存为 .rtf,但没有成功。

请提供任何帮助。

【问题讨论】:

  • 使用真正的 RTF 文件。使用写字板或 Microsoft Word 创建一个。
  • 运气好吗?我一直想知道你是否发现了这个问题。

标签: c# windows richtextbox


【解决方案1】:

好的,

看起来整个 rtb.LoadFile() 东西对你不起作用。你能试试用这种方式加载文件吗?:

using(var of = new OpenFileDialog())
{
     of.DefaultExt="*.rtf";
     of.Filter = "RTF Files|*.rtf";

     if(of.ShowDialog() == DialogResult.OK)
          rtb.Rtf = System.IO.File.ReadAllText(of.FileName);
}

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我不认为 cs 文件是真正的 rtf。尝试将 LoadFile 的重载与流类型一起使用,例如

    rtbTest.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);
    

    除此之外,您确定富文本框足够大,可以显示比第一行更多的内容吗?

    编辑

    我试过了。我在 vs2010 中使用了 windows 窗体(我认为你正在使用 windows 窗体,但不是 100% 确定)。我创建了一个 Windows 窗体项目并将 Project.cs 保存为 rtf。我在按钮的点击处理程序中添加了一个按钮和一个RichTextBox 我添加了问题中的代码。当我加载 Program.rtf 时,它实际上引发了异常,因为它的格式不正确。我在LoadFile 调用中添加了RichTextBoxStreamType.PlainText 参数并且它起作用了。它显示了整个文件。

    【讨论】:

    • 嗨,迈克。谢谢,这是我正在使用的Windows窗体。我已经尝试过了,但无法让它工作。我有足够的空间。我尝试在 word 和 word pad 中创建 .rtf 文件并将 .cs 文件保存为 rtf。始终只获得第一行。
    • @Ted - 很遗憾听到它没有帮助。您的应用程序是否在后台线程中执行此操作?或者还有什么可能会产生影响的?您是否尝试过我在编辑中描述的作为单独项目的内容,只是为了看看它是否适用于裸机案例?
    • 我已经在它自己的项目中得到了它,但结果仍然相同。我不知道。 :(
    【解决方案3】:

    您最初是如何保存 RTF 文件的?我同意 Mike Two 的观点,文件中的内容并非真正的 RTF。

    您可以使用写字板验证文件是否正确加载,这是我在处理 RTF 文件时使用的。

    更新:

    您可以尝试的一种调查技术如下:将文件加载到 RichTextBox 后,检查调试器为 RichTextBox.Rtf 属性提供的内容 - 您应该会看到所有 RTF 文本,包括格式。如果它确实“全部存在”,那么您就知道您正在正确读取文件。

    让我担心的是,您正试图查看保存为 RTF 的代码文件。这显然不应该是一个问题,但是,我建议保存一个 非常 简单的 RTF 文件,其中可能只有两行普通文本(想想:lorem ipsum)。如果 that 加载正常,那么您将知道您正在阅读的代码文件中的某些特定内容正在搞砸事情。不太可能,但这是一种明显的故障排除策略。

    作为最后的手段,请在另一台机器上尝试。

    【讨论】:

    • 嗨查理。谢谢。我已经尝试了您的建议,但没有成功。
    【解决方案4】:

    当所有其他方法都失败时,检查这些愚蠢的东西...您是否将 RichTextBox 控件设置为多行?还是设置为单行模式?也许您正确加载了整个文件,但控件只显示第一行,因为这是您告诉它的:)

    检查RichTextBox.Multiline。这是一个远射,但也许?

    我创建了一个带有停靠 RichTextBox 控件的示例项目,保留了所有默认值(Dock = DockStyle.Fill 除外),添加了一个简单的 File->Open 菜单并将您的代码剪切'n'粘贴到菜单处理程序中。我必须对您的代码进行的唯一更改是将第二个 LoadFile 参数从 RichTextBoxStreamType.PlainText 更改为 RichTextBoxStreamType.RichText。

    从 Word 中保存的复杂文件(链接、格式、图形等)对我来说打开得很好。

    另一个常见的问题是控件很短。您可能认为它正在填充您的客户区域,但实际上它只是一条窄条,因此您只能看到一条高线。您是否正确设置了尺寸、停靠和/或锚点属性?您看到文档的滚动条了吗?它比你预期的要短吗?

    【讨论】:

    • 为了将来参考,RichTextBox 控件默认是多行的,我很确定你不能再做单行。 :)
    【解决方案5】:

    这将起作用:

    StreamReader sr = new StreamReader(sFileName, Encoding.Default, true); 
    string sRtfFile = sr.ReadToEnd();
    sr.Close();
    rtbCombinedFile.Rtf = sRtfFile;
    

    sFileName 当然是 RTF 文件的完整路径。 StreamReader 是“System.IO”的一部分。

    【讨论】:

      【解决方案6】:

      只需将文本文件读入字符串并设置 RichTextBox 的 Rtf 属性即可。

      如果你不确定你的文本是否包含 Rtf 文本,你可以使用我写的这个类。它继承自原始的 RichTextBox,如果内容不是 rtf 或格式错误,则具有后备功能。

      public class RichTextBoxEx :RichTextBox
      {
      
          public new String Rtf
          {
              get
              {
                  return base.Rtf;
              }
              set
              {
      
                  try
                  {
                      // is this rtf?
                      if (Regex.IsMatch(value, @"^{\\rtf1"))
                      {
                          base.Rtf = value;
                      }
                      else
                      {
                          base.Text = value;
                      }
                  }
                  catch (ArgumentException) // happens if rtf content is corrupt
                  {
                      base.Text = value;
                  }
              }
          }
      
      }
      

      【讨论】:

        【解决方案7】:

        我认为问题出在 RichTextBoxStreamType 上,因为您将其设置为 PlainText,但您希望将 RichText 加载到 Richtextbox 控件中,所以为什么不使用 RichTextBoxStreamType.RichText 我已经尝试了以下代码,它可以正常工作。

                // Create an OpenFileDialog to request a file to open.
                OpenFileDialog openFile1 = new OpenFileDialog();
        
                // Initialize the OpenFileDialog to look for RTF files.
                openFile1.DefaultExt = "*.rtf";
                openFile1.Filter = "RTF Files|*.rtf";
        
                // Determine whether the user selected a file from the OpenFileDialog.
                if (openFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    // Load the contents of the file into the RichTextBox.
                    richTextBox1.LoadFile(openFile1.FileName, RichTextBoxStreamType.RichText);
                }
        

        【讨论】:

          【解决方案8】:

          不确定它在 WinForms 中是否与 WPF 中相同,但在 WPF 中,您必须使用设置为 RichTextBox 的 Document 属性的 FlowDocument。 这是我必须从 WebStream 中读取的代码(对于 FileStreams 也可以这样做

          protected static FlowDocument LoadRemoteRtf(string path)
              {
                  var doc = new FlowDocument();
                  if (!string.IsNullOrEmpty(path))
                  {
                      var range = new TextRange(doc.ContentStart, doc.ContentEnd);
                      var downloader = new WebClient();
                      Stream stream = null;
                      try
                      {
                          stream = downloader.OpenRead(path);
                          range.Load(stream, DataFormats.Rtf);
                      }
                      catch (Exception ex)
                      {
                          var props = new Dictionary<string, object> {{"URL", path}};
                          Logging.WriteLogEntry("Failed to load remote RTF document.", ex, TraceEventType.Information, props);
                      }
                      finally
                      {
                          if (stream != null)
                          {
                              stream.Close();
                          }
                          downloader.Dispose();
                      }
                  }
                  return doc;
              }
          
          MyRTB.Document = LoadRemoteRtf("http://myserver.com/docs/remote.rtf");
          

          【讨论】:

            【解决方案9】:

            您也可以尝试将 RichTextBox Modifiers 属性设置为“public”并查看是否有效,还可以检查 WordWrap 属性是否设置为 true,即您正在阅读的文件是否全部写在 1 行上,只是很长行,即使不是,它仍会根据 RichTextBox 的大小包装那些长行。

            不知道你有没有用过,你用过ReSharper吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多