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

时间:2010-05-01 14:23:57

标签: c# windows richtextbox

我正在尝试将文件加载到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,但没有成功。

任何帮助表示赞赏。

9 个答案:

答案 0 :(得分: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 :(得分:1)

我认为cs文件不是真正的rtf。尝试将LoadFile的重载与流类型(如

)一起使用
rtbTest.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);

除此之外,您确定富文本框是否足以显示多于第一行?

修改

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

答案 2 :(得分:1)

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

您可以使用Wordpad验证文件是否正确加载,这是我在使用RTF文件时使用的。

<强>更新

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

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

作为最后的手段,请在不同的机器上试用。

答案 3 :(得分:1)

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

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

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

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

另一个常见问题是控制非常短暂。您可能认为它填满了您的客户区域,但实际上它只是一个狭窄的条带,因此您只能看到一条高线。您是否正确设置了尺寸,对接和/或锚定属性?您是否看到了文档的滚动条?它比你期望的短吗?

答案 4 :(得分:1)

这将有效:

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

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

答案 5 :(得分: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;
            }
        }
    }

}

答案 6 :(得分: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);
        }

答案 7 :(得分:0)

不确定它是否与WPF中的WinForms相同,但在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");

答案 8 :(得分:0)

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

我不知道你是否已经使用它,你试过ReSharper吗?