将RTF文件加载到Windows richTextBox时出现问题

4

我正在尝试将文件加载到Windows Forms (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或WordPad中创建的RTF文件,也尝试将.cs文件另存为.rtf文件,但都没有成功。

如果有帮助,请提供支持,谢谢。


使用真正的RTF文件。使用WordPad或Microsoft Word创建一个。 - Hans Passant
有什么进展吗?我一直在想你是否解决了这个问题。 - Mike Two
9个回答

3

好的,

看起来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);
}

我希望这可以帮助你。

1

这个会起作用:

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

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


1

只需将文本文件读入字符串,然后设置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;
            }
        }
    }

}

1

我认为这个cs文件并不是真正的rtf格式。尝试使用带有流类型的LoadFile重载。

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

除此之外,你确定富文本框足够大,可以显示超过第一行吗?

编辑

我试过了。我在vs2010中使用了Windows表单(我想你也是用的Windows表单,但不确定)。我创建了一个Windows表单项目,并将Project.cs保存为rtf格式。我添加了一个按钮和一个RichTextBox,在按钮的单击处理程序中,我添加了问题中的代码。当我加载Program.rtf时,它实际上会抛出异常,因为它不是正确的格式。我在LoadFile调用中添加了RichTextBoxStreamType.PlainText参数,然后它就可以工作了。它显示了整个文件。


嗨,Mike。谢谢,我正在使用Windows表单。我已经尝试过这个,但无法使其工作。我有足够的空间。我尝试在Word和Word Pad中创建.rtf文件,并将.cs文件保存为rtf。始终只得到第一行。 - Ted
@Ted - 很抱歉听到它没有帮助。你的应用程序是否在后台线程中执行此操作?或者还有其他可能会产生影响的因素吗?你是否尝试过我在编辑中描述的作为单独项目的方式,只是为了看看它是否在最基本的情况下起作用? - Mike Two
我把它放在了自己的项目中,但结果还是一样的。我不知道。 :( - Ted

1

你最初是如何保存RTF文件的?我同意Mike Two的看法,该文件中有一些不是真正的RTF格式。

你可以使用Wordpad验证文件是否正确加载,这是我在处理RTF文件时使用的工具。

更新:

你可以尝试一种调查技术:将文件加载到RichTextBox后,检查调试器对RichTextBox.Rtf属性的返回值 - 你应该能够看到包括格式在内的所有RTF文本。如果确实“全部都在”,那么你就知道你正在正确读取文件。

让我担心的是,你正在尝试查看一个保存为RTF格式的代码文件。这显然不应该是一个问题,但是我建议你保存一个非常简单的RTF文件,其中只有两行普通文本(例如:lorem ipsum)。如果那个文件可以正常加载,那么你就知道是你正在读取的代码文件中的某些特定内容导致了问题。虽然可能性很小,但这是一个明显的故障排除策略。

作为最后的手段,你可以尝试在另一台机器上操作。


嗨,查理。谢谢。我尝试了你建议的方法,但没有成功。 - Ted

1

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

检查RichTextBox.Multiline。这可能是一个冒险,但也许可以尝试一下?

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

一个包含链接、格式、图形等复杂内容的Word保存文件对我来说打开得很好。

另一个常见问题是控件非常短。你可能认为它填充了客户区域,但实际上它只是一个狭窄的条纹,所以你只能看到一行高度。你是否正确设置了大小、停靠和/或锚定属性?你是否看到了文档的滚动条?它比你预期的要短吗?


作为参考,RichTextBox 控件默认是多行的,我相当确定您不能使其为单行。 :) - anon271334

0

不确定WinForms和WPF是否相同,但在WPF中,您必须使用设置为RichTextBox的Document属性的FlowDocument。

这是我用于从WebStream读取的代码(FileStream也可以执行相同的操作)

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");

0

我认为问题出在RichTextBoxStreamType上,因为你将其设置为PlainText,但是你想要在richtextbox控件中加载RichText,那么为什么不使用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);
        }

0
您也可以尝试将您的RichTextBox Modifiers属性设置为“public”,看看是否有效,还要检查WordWrap属性是否设置为true,如果您正在阅读的文件都是写在一行上的长句子,即使不是,它仍然会根据您的RichTextBox的大小折叠那些长句子。
我不知道您是否已经使用了ReSharper?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接