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

C# 将RTF文件加载到windows richTextBox时出现问题,c#,windows,richtextbox,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.

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


非常感谢您的帮助。

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

rtbTest.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText);
除此之外,您确定富文本框足够大,可以显示多于第一行的内容吗

编辑


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

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

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

更新:

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

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


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

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

选中
RichTextBox.Multiline
。这是一个长镜头,但也许

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

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


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

我认为问题在于RichTextBoxStreamType,因为您将其设置为纯文本,但希望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);
        }
好,

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

我希望这会有所帮助。

不确定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");
受保护的静态FlowDocument LoadRemoteRtf(字符串路径)
{
var doc=新的流程文档();
如果(!string.IsNullOrEmpty(路径))
{
变量范围=新的文本范围(doc.ContentStart,doc.ContentEnd);
var downloader=new WebClient();
Stream=null;
尝试
{
stream=downloader.OpenRead(路径);
加载(流、数据格式.Rtf);
}
捕获(例外情况除外)
{
var props=新字典{{“URL”,路径};
Logging.WriteLogEntry(“加载远程RTF文档失败”,例如,TraceEventType.Information,props);
}
最后
{
if(流!=null)
{
stream.Close();
}
downloader.Dispose();
}
}
退货单;
}
MyRTB.Document=LoadRemoteRtf(“http://myserver.com/docs/remote.rtf");
这将起作用:

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

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

您也可以尝试将RichTextBox Modifiers属性设置为“public”看看这是否有效,同时检查WordWrap属性是否设置为true,也就是说,如果您正在读取的文件都写在一行上,只是一个长行,即使没有,它仍然会根据RichTextBox的大小来包装这些长行


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

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

}

使用真实的RTF文件。使用写字板或Microsoft Word创建一个。运气好吗?我一直想知道你是否曾经想到过你