none
Как сохранять RichTextBox? RRS feed

  • Вопрос

  • Здравствуйте!

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

    private void button1_Click(object sender, EventArgs e)
            {
                // Create a SaveFileDialog to request a path and file name to save to.
                SaveFileDialog saveFile1 = new SaveFileDialog();
    
                // Initialize the SaveFileDialog to specify the RTF extension for the file.
                saveFile1.DefaultExt = "*.tsx";
                saveFile1.Filter = "Test files|*.tsx";
    
                // Determine if the user selected a file name from the saveFileDialog.
                if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
                   saveFile1.FileName.Length > 0)
                {
                    // Save the contents of the RichTextBox into the file.
                    richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.RichText);
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFile1 = new OpenFileDialog();
                openFile1.DefaultExt = "*.tsx";
                openFile1.Filter = "Test files|*.tsx";
                if(openFile1.ShowDialog()==DialogResult.OK 
                    && openFile1.FileName.Length > 0)
                {
                    richTextBox1.LoadFile(openFile1.FileName, RichTextBoxStreamType.RichText);
                }
    
            }
    

    Этот код работает только с одним RichTextBox. Как поступить если в программе несколько таких элементов?

    20 сентября 2011 г. 3:06

Ответы

  • >Quest.Rtf = RTB.RTFq.ToString();

    Что это ?

     

    Делайте так:

    using System;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    namespace WindowsFormsApplication128
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                RichTextBox tb1 = new RichTextBox();
                tb1.Text = "bla bla bla";
                tb1.Parent = this;
    
                RichTextBox tb2 = new RichTextBox();
                tb2.Text = "bla bla bla";
                tb2.Parent = this;
                //
                RTFcontainer container = new RTFcontainer();
                container.RTFs.Add(tb1.Rtf);
                container.RTFs.Add(tb2.Rtf);
                //пишем
                using(var fs = new FileStream("c:\\temp.bin", FileMode.Create))
                    new BinaryFormatter().Serialize(fs, container);
                //читаем
                using (var fs = new FileStream("c:\\temp.bin", FileMode.Open))
                    container = (RTFcontainer)new BinaryFormatter().Deserialize(fs);
                //
                tb1.Rtf = container.RTFs[0];
                tb2.Rtf = container.RTFs[1];
            }
    
            [Serializable]
            class RTFcontainer
            {
                public List<string> RTFs = new List<string>();
            }
        }
    }
    

     

    • Предложено в качестве ответа Abolmasov Dmitry 20 сентября 2011 г. 7:51
    • Помечено в качестве ответа a_basic_man 20 сентября 2011 г. 9:27
    20 сентября 2011 г. 7:12

Все ответы

  • Вместо SaveFileDialog/OpenFileDialog использовать FolderBrowserDialog и записывать данные из RichTextBox'ов в файлы с фиксированными именами в папку.
    20 сентября 2011 г. 3:52
    Модератор
  • Тогда таких файлов будет слишком много, мне надо будет потом их копировать/перемещать.
    20 сентября 2011 г. 4:02
  • Создайте объект, хранящий RTF текст и сериализуйте его.
    [Serializable]
    class RTFcontainer
    {
           public List<string> RTFs = new List<string>();
    }
    
    
    ....
    rtfContainer.RTFs.Add(richTextBox1.RTF);
    ...
    new BinaryFormatter().Serialize(fileName, rtfContainer);
    20 сентября 2011 г. 4:53
  • А если в них есть не только текст но и рисунки? Попробую.
    20 сентября 2011 г. 4:57
  • Формат RTF хранит и рисунки в том числе

    20 сентября 2011 г. 5:21
  • Выдает ошибку:

    Ошибка 1 Запрошенную операцию нельзя выполнить для файла с открытой пользователем сопоставленной секцией.
     RichTextBoxes


    Вот код

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    namespace RichTextBoxes
    {
        public partial class Form1 : Form
        {
            RTFcontainer RTB = new RTFcontainer();
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                RTB.RTFq.Add(Quest.Rtf);
                RTB.RTFa.Add(varA.Rtf);
                RTB.RTFb.Add(varB.Rtf);
                RTB.RTFc.Add(varC.Rtf);
                RTB.RTFd.Add(varD.Rtf);
                RTB.RTFe.Add(varE.Rtf);
                // Create a SaveFileDialog to request a path and file name to save to.
                SaveFileDialog saveFile1 = new SaveFileDialog();
    
                // Initialize the SaveFileDialog to specify the RTF extension for the file.
                saveFile1.DefaultExt = "*.tsx";
                saveFile1.Filter = "Test files|*.tsx";
    
                // Determine if the user selected a file name from the saveFileDialog.
                if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
                   saveFile1.FileName.Length > 0)
                {
                    Quest.Clear();
                    varA.Clear();
                    varB.Clear();
                    varC.Clear();
                    varD.Clear();
                    varE.Clear();
                    // Save the contents of the RichTextBox into the file.                
                    BinaryFormatter binFormat = new BinaryFormatter();
                    using (Stream fStream = new FileStream(saveFile1.FileName, FileMode.Create, FileAccess.Write,
                        FileShare.None))
                    {
                        binFormat.Serialize(fStream, RTB );
                    }                
                }
            }
    
            private void btnLoad_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFile1 = new OpenFileDialog();
                openFile1.DefaultExt = "*.tsx";
                openFile1.Filter = "Test files|*.tsx";
                if (openFile1.ShowDialog() == DialogResult.OK
                    && openFile1.FileName.Length > 0)
                {
                    //richTextBox1.LoadFile(openFile1.FileName, RichTextBoxStreamType.RichText);
                    BinaryFormatter binFormat = new BinaryFormatter();
                    using (Stream fStream = File.OpenRead(openFile1.FileName))
                    {
                        RTB = new RTFcontainer();
                        RTB = (RTFcontainer )binFormat.Deserialize(fStream);
                    }
                    
                    Quest.Rtf = RTB.RTFq.ToString();
                    varA.Rtf = RTB.RTFa.ToString();
                    varB.Rtf = RTB.RTFb.ToString();
                    varC.Rtf = RTB.RTFc.ToString();
                    varD.Rtf = RTB.RTFd.ToString();
                    varE.Rtf = RTB.RTFe.ToString();
                }
            }
        }
    
        [Serializable]
        class RTFcontainer
        {
            public List<string> RTFq = new List<string>();
            public List<string> RTFa = new List<string>();
            public List<string> RTFb = new List<string>();
            public List<string> RTFc = new List<string>();
            public List<string> RTFd = new List<string>();
            public List<string> RTFe = new List<string>();
        }
    
    }
    

    В чем ошибка-то?

    20 сентября 2011 г. 5:46
  • >Quest.Rtf = RTB.RTFq.ToString();

    Что это ?

     

    Делайте так:

    using System;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    namespace WindowsFormsApplication128
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                RichTextBox tb1 = new RichTextBox();
                tb1.Text = "bla bla bla";
                tb1.Parent = this;
    
                RichTextBox tb2 = new RichTextBox();
                tb2.Text = "bla bla bla";
                tb2.Parent = this;
                //
                RTFcontainer container = new RTFcontainer();
                container.RTFs.Add(tb1.Rtf);
                container.RTFs.Add(tb2.Rtf);
                //пишем
                using(var fs = new FileStream("c:\\temp.bin", FileMode.Create))
                    new BinaryFormatter().Serialize(fs, container);
                //читаем
                using (var fs = new FileStream("c:\\temp.bin", FileMode.Open))
                    container = (RTFcontainer)new BinaryFormatter().Deserialize(fs);
                //
                tb1.Rtf = container.RTFs[0];
                tb2.Rtf = container.RTFs[1];
            }
    
            [Serializable]
            class RTFcontainer
            {
                public List<string> RTFs = new List<string>();
            }
        }
    }
    

     

    • Предложено в качестве ответа Abolmasov Dmitry 20 сентября 2011 г. 7:51
    • Помечено в качестве ответа a_basic_man 20 сентября 2011 г. 9:27
    20 сентября 2011 г. 7:12
  • Уважаемый пользователь, пожалуйста, не забудьте отметить сообщение или сообщения, которые являются решением вашей проблемы, даже если это ваше собстевенное сообщение. Это можно сделать с помощью кнопки 'Пометить как ответ', которая есть под каждым сообщением.

    Спасибо.


    Для связи [mail]
    20 сентября 2011 г. 7:51