Robmeister8911 Ответов: 1

Ошибка при попытке прочитать файл с многострочным текстовым полем.


Итак, у меня есть 20+ richtextboxes, и все они предназначены для того, чтобы в них было набрано несколько строк. Но когда я пытаюсь загрузить этот файл, он помещает каждую строку в отдельный richtextbox вместо того, в который они все были набраны. Как мне обойти это и открыть в этом конкретном поле только то, что введено в определенный richtextbox?

Ниже приведен мой открытый код. Я могу опубликовать свой код сохранения, если кому-то нужно его увидеть. Пожалуйста, не я временно удалил флажки от открытия/сохранения, потому что я продолжал получать ошибку во время тестирования за то, что не был допустимым логическим значением. Я удалил текстовые поля и комбо-боксы из приведенного ниже кода, потому что он сказал, что сообщение было слишком длинным.

Что я уже пробовал:

        private void OpenToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            ofd.Filter = "WAP Files (.wap)|*.wap";
            ofd.Title = "Open File";
            
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                StreamReader read = new StreamReader(File.OpenRead(ofd.FileName));

                //replacefridge_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //vhoodcab_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //vhoodnocab_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //furdown_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //exhaust1_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //exhaustkit1_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //timer1_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //exhaust2_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //exhaustkit2_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //timer2_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //replacewh_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //newcloset_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //repaircloset_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //replacestove_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //smokealarm_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //codetector_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //dryervent_ckbox.Checked = Convert.ToBoolean(read.ReadLine());
                //replacefurnace_ckbox.Checked = Convert.ToBoolean(read.ReadLine());

......

                wallcomments.Text = read.ReadLine();
                floorcomments.Text = read.ReadLine();
                atticcomments.Text = read.ReadLine();
                fridgecomments.Text = read.ReadLine();
                door1comments.Text = read.ReadLine();
                door2comments.Text = read.ReadLine();
                door3comments.Text = read.ReadLine();
                door4comments.Text = read.ReadLine();
                livingroomcomments.Text = read.ReadLine();
                diningroomcomments.Text = read.ReadLine();
                kitchencomments.Text = read.ReadLine();
                hallwaycomments.Text = read.ReadLine();
                bathroom2comments.Text = read.ReadLine();
                bathroom1comments.Text = read.ReadLine();
                bedroom2comments.Text = read.ReadLine();
                bedroom1comments.Text = read.ReadLine();
                bedroom4comments.Text = read.ReadLine();
                bedroom3comments.Text = read.ReadLine();
                addroom2comments.Text = read.ReadLine();
                addroom1comments.Text = read.ReadLine();
                whcomments.Text = read.ReadLine();
                h_scomments.Text = read.ReadLine();
                hvaccomments.Text = read.ReadLine();
                
                fileName = ofd.FileName;
                filename_label.Text = System.IO.Path.GetFileName(fileName);

                read.Close();
                read.Dispose();
            }
        }

ZurdoDev

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

Richard MacCutchan

Код делает то, что вы ему говорите, вам нужно посмотреть, правильно ли вы выбираете поля для каждой строки. Никогда не стоит предполагать, что то, что Вы читаете из файла, является правильными данными, вам нужен какой-то способ добавления некоторых метаданных, чтобы сказать вам, к какому текстовому полю принадлежит строка.

[no name]

Он будет писать в каждое текстовое поле, потому что вы назначаете "читать.ReadLine (); " каждому из них. Вот ваш код -

wallcomments.Текст = читать.Линия чтения();
напольные покрытия.Текст = читать.Линия чтения();
аттиккомменты.Текст = читать.Линия чтения();
фриджекомменты.Текст = читать.Линия чтения();
door1comments.Текст = читать.Линия чтения();
и так далее....

1 Ответов

Рейтинг:
5

OriginalGriff

Скорее всего, данные, которые вы сохраняете, содержат символы новой строки, а это означает, что вы не можете использовать новую строку в качестве "разделителя данных", потому что ваш код при чтении понятия не имеет, какая новая строка является частью ваших данных, а какая должна разделять данные на разные текстовые поля.

Если ваши данные имеют свободную форму, то сохранение их в "открытом тексте" - плохая идея: я бы посоветовал вам посмотреть на их хранение, возможно, в XML-файле: Вывод в XML - поиск Google[^] или в собственническом формате - это может помочь: ByteArrayBuilder - строковый конструктор для байтов[^Это то, что я использую для своих двоичных данных, но он счастливо хранит и восстанавливает несколько строк.


Robmeister8911

Итак, я обнаружил, что XmlWriter будет работать на меня... однако.. У меня возникли проблемы с тем, как сохранить состояние флажка в XmlWriter. Есть какая-нибудь помощь по этой теме?

private void save_xml_Click(object sender, EventArgs e)
        {
            sfd.Filter = "XML Files (.xml)|*.xml";
            sfd.Title = "Save As";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                XmlWriter writer = XmlWriter.Create(sfd.FileName);

                writer.WriteStartDocument();
                writer.WriteStartElement("Assessment_Info");

                writer.WriteStartElement("Date");
                writer.WriteString(date_tbox.Text);
                writer.WriteEndElement();

                writer.WriteStartElement("Name");
                writer.WriteString(name_tbox.Text);
                writer.WriteEndElement();

                writer.WriteStartElement("Address");
                writer.WriteString(address_tbox.Text);
                writer.WriteEndElement();
                
                

                writer.WriteStartElement("Exterior_Type");
                writer.WriteString(exterior_cbox.Text);
                writer.WriteEndElement();

                writer.WriteStartElement("Wall_Comments");
                writer.WriteString(wallcomments.Text);
                writer.WriteEndElement();


                writer.WriteEndDocument();

                writer.Close();

            }
        }

OriginalGriff

В чем проблема? Что вы пытались сделать, чтобы спасти государство?
Вы не можете использовать
WriteString(myCheckBox.Проверен.Метод toString());

Robmeister8911

Это сработало, спасибо. Но как насчет того, чтобы загрузить его обратно как логическое значение?

        private XmlDocument doc;
        private XmlElement root;

        private void open_xml_Click(object sender, EventArgs e)
        {
            ofd.Filter = "XML Files (.xml)|*.xml";
            ofd.Title = "Open File";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(ofd.FileName);
                root = doc.DocumentElement;
                date_tbox.Text = root.GetElementsByTagName("Date")[0].InnerText;
                name_tbox.Text = root.GetElementsByTagName("Name")[0].InnerText;
                address_tbox.Text = root.GetElementsByTagName("Address")[0].InnerText;

                //replacefridge_ckbox.Checked = root.GetElementsByTagName("Replace_Fridge")[0].InnerText;

                exterior_cbox.Text = root.GetElementsByTagName("Exterior_Type")[0].InnerText;
                wallcomments.Text = root.GetElementsByTagName("Wall_Comments")[0].InnerText;

                fileName = ofd.FileName;
                filename_label.Text = System.IO.Path.GetFileName(fileName);

            }
        }

OriginalGriff

Это значение bool: таким образом, строка будет либо "True", либо "False" - и bool имеет как метод Parse, так и метод TryParse:
https://msdn.microsoft.com/en-us/library/system.boolean.parse(v=против 110). aspx
https://msdn.microsoft.com/en-us/library/system.boolean.tryparse(v=против 110). aspx

Robmeister8911

Я понимаю, что это логическое значение, и спрашиваю, как его преобразовать? Я читал ссылки, которые вы мне прислали, но это не помогло.. Я нуб в кодировании так что есть много вещей которые я не могу сделать ЛОЛ

OriginalGriff

Ты ведь шутишь, правда?
Вы не можете решить это самостоятельно:

string valueIreadFromTheFile = " True";
или
string valueIreadFromTheFile = " False";
затем
логическое значение типа bool.Синтаксический анализ(valueIreadFromTheFile);

Robmeister8911

Ты действительно не должен быть придурком по этому поводу. Я пришел сюда за помощью, а не за оскорблениями.

OriginalGriff

Тогда не задавайте вопросов, на которые вы знаете ответ или должны быть в состоянии решить очень легко, читая ссылки, которые вам даны.
Если бы в примерах не было тривиального кода, я бы так не отреагировал. Подумайте об этом: я здесь не для того, чтобы делать все для вас, вы должны уметь думать (иначе вы не были бы в этой игре) - так что тратить наше время на то, что вы должны знать, как делать (или, по крайней мере, должны, если вы немного приложите себя), намного грубее, чем я был для вас...