Проблема загрузки файла RTF в windows richTextBox - PullRequest
4 голосов
/ 01 мая 2010

Я пытаюсь загрузить файлы в 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);
        }

Я пытался использовать файлы rtf, созданные в word или word pad, и пытался сохранить файлы .cs как .rtf безуспешно.

Любая помощь приветствуется, пожалуйста.

Ответы [ 9 ]

3 голосов
/ 23 мая 2010

Хорошо,

Похоже, что вся функция 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 голос
/ 18 июня 2010

Просто прочитайте текстовый файл в строку и установите свойство Rtf RichTextBox.

Если вы не уверены, что ваш текст содержит текст 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 голос
/ 02 июня 2010

Это будет работать:

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

sFileName - это, конечно, полный путь к файлу RTF. StreamReader является частью "System.IO."

1 голос
/ 12 мая 2010

Когда все остальное терпит неудачу, проверьте глупости ... Вы установили элемент управления RichTextBox многострочным? Или он установлен в однострочный режим? Возможно, вы правильно загружаете весь файл, но элемент управления отображает только первую строку, потому что это то, что вы сказали:)

Проверка RichTextBox.Multiline. Это длинный кадр, но может быть?

Я создал пример проекта с закрепленным элементом управления RichTextBox, сохранил все значения по умолчанию (кроме Dock = DockStyle.Fill), добавил простое меню File-> Open и вырезал и вставил ваш код в обработчик меню. Единственное изменение, которое я должен был внести в ваш код, - это изменить второй параметр LoadFile с RichTextBoxStreamType.PlainText на RichTextBoxStreamType.RichText.

Сложный файл (ссылки, форматирование, графика и т. Д.), Сохраненный из Word, открылся для меня просто отлично.

Другая распространенная проблема заключается в том, что управление очень короткое. Вы можете подумать, что он заполняет вашу клиентскую область, но на самом деле это всего лишь узкая полоска, поэтому вы видите только одну линию в высоту. Правильно ли вы установили размер, стыковку и / или привязку? Вы видите полосу прокрутки для вашего документа? Это короче, чем вы ожидаете?

1 голос
/ 01 мая 2010

Как вы изначально сохранили файл RTF? Я согласен с Майком Два, в файле есть вещи, которые на самом деле не RTF.

Вы можете проверить правильность загрузки файла с помощью Wordpad, что я и использую при работе с файлами RTF.

Обновление:

Один из методов расследования, который вы можете попробовать, заключается в следующем: после загрузки файла в RichTextBox проверьте, что дает отладчик для свойства RichTextBox.Rtf - вы должны увидеть весь текст RTF, включая форматирование. Если это действительно «все там», то вы знаете, что читаете файл правильно.

Что меня беспокоит, так это то, что вы пытаетесь просмотреть файл кода, сохраненный в формате RTF. Это, очевидно, не должно быть проблемой, однако, я рекомендую сохранить очень простой RTF-файл, возможно, с двумя строками обычного текста (подумайте: lorem ipsum). Если , что загружается нормально, то вы будете знать, что это что-то конкретное в вашем кодовом файле, которое вы читаете, что испортит ситуацию. Весьма маловероятно, но это очевидная тактика устранения неполадок.

В крайнем случае, попробуйте на другой машине.

1 голос
/ 01 мая 2010

Я не думаю, что файл CS действительно RTF. Попробуйте использовать перегрузку LoadFile с типом потока, таким как

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

Кроме этого, вы уверены, что поле расширенного текста достаточно велико, чтобы показывать больше, чем первая строка?

Редактировать

Я попробовал это. Я использовал формы Windows vs2010 (я думаю, что вы используете формы Windows, но не уверен на 100%). Я создал проект Windows Forms и сохранил Project.cs как RTF. Я добавил кнопку и RichTextBox в обработчике нажатия кнопки. Я добавил код из вопроса. Это на самом деле вызвала исключение, когда я загрузил Program.rtf, потому что он был не в правильном формате. Я добавил аргумент RichTextBoxStreamType.PlainText к вызову LoadFile, и он сработал. Он показал весь файл.

0 голосов
/ 03 июня 2010

Вы также можете попробовать установить свойство RichTextBox Modifiers в значение «public» и посмотреть, работает ли оно, также проверить, установлено ли для свойства WordWrap значение true, то есть если файл, который вы читаете, записан в одну строку, просто строка, даже если это не так, она будет переносить эти длинные строки в зависимости от размера вашего RichTextBox.

Не знаю, используете ли вы его уже, пробовали ли вы ReSharper?

0 голосов
/ 26 мая 2010

Не уверен, что в WinForms он такой же, как в WPF, но в WPF необходимо использовать FlowDocument, установленный для свойства Document RichTextBox. это код, который я должен прочитать из 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");
0 голосов
/ 19 мая 2010

Я думаю, что проблема в 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);
        }
...