Member 13347457 Ответов: 1

Как сохранить список в текстовом файле


Доброе утро!
У меня есть сомнения, я много искал, но ничего не нашел, надеюсь, кто-нибудь сможет мне помочь.
Очень хорошо.

У меня есть 2 формы, на форме 1 у меня есть кнопка, а в форме 2 У меня есть список с данными.
Что я хочу, так это нажать кнопку на Form1 и сохранить данные из списка Form2 в текстовом файле.

Типы данных, которые находятся в listbox, довольно просты, listbox имеет не более 12 строк, и каждая строка имеет только одно слово.

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

Это кнопка на форме 1

private void toolStripButtonGuardar_Click(object sender, EventArgs e)
        {
            var myForm = new FormVer();

            //Escolher onde salvar o arquivo
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            sfd.Title = "Guardar";
            sfd.Filter = "Arquivos TXT (*.txt)|*.txt";

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                try
                {

                    File.WriteAllLines(sfd.FileName, myForm.listBox.Items.OfType<string>());

                    //Mensagem de confirmação
                    MessageBox.Show("Guardado com sucesso", "Notificação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }


Но это не работает, всегда сохраняйте файл пустым.

Alan N

Зачем вы создаете новую форму? Вам нужна ссылка на существующий FormVer.

1 Ответов

Рейтинг:
2

Graeme_Grant

File.WriteAllText(sfd.FileName, string.Join("|", myForm.listBox.Items.OfType<string>()));

Обновление: Приведенное выше решение основано на предоставленной информации. Вы подразумеваете, что данные в списке являются простыми строками, поэтому приведенный выше код объединяет строки и записывает их на диск в виде непрерывной строки.

Если вы используете сложные объекты, такие как классы, то вам нужно сделать больше работы по сериализации объекта, прежде чем вы сможете записать его на диск.

Вот помощник [Newtonsoft] JSON для сериализации и десериализации:
using Newtonsoft.Json;
using System.Collections.Generic;

namespace DotNet.Shared.Helpers
{
    public static class JsonConverter
    {
        public static string FromClass<T>(T data, bool isEmptyToNull = false, JsonSerializerSettings jsonSettings = null)
        {
            string response = string.Empty;

            if (!EqualityComparer<T>.Default.Equals(data, default(T)))
                response = JsonConvert.SerializeObject(data, jsonSettings);

            return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
        }

        public static T ToClass<T>(string data, JsonSerializerSettings jsonSettings = null)
        {
            var response = default(T);

            if (!string.IsNullOrEmpty(data))
                response = jsonSettings == null
                    ? JsonConvert.DeserializeObject<T>(data)
                    : JsonConvert.DeserializeObject<T>(data, jsonSettings);

            return response;
        }
    }
}

И использовать:
File.WriteAllText(sfd.FileName, JsonConverter.FromClass(listBox1.Items.OfType<Person>()));


Обновление №2: Из-за этой строки у вас всегда будут пустые файлы:
var myForm = new FormVer();

Вместо того чтобы создавать новую форму с пустыми данными, вам нужно указать на активную форму с данными. Что-то вроде:
var myForm = Application.OpenForms[nameof(FormVer)];


Member 13347457

Я попробовал это сделать, но это дает ошибку, говорит "" не может преобразовать из строки в строку []
Я думаю, что проблема заключается в "MyForm"
Потому что я сделал тест, но только я сделал все на одной и той же форме, то есть в форме 2, так как кнопка и список были на одной и той же форме, все прошло нормально и сохранилось все нормально.
Но только то, что мне нужно сделать даже с помощью кнопки на Form1 и listbox Form2, то есть мне нужно вызвать ListBox.
Я считаю, что проблема заключается в вызове списка
Но я не знаю, как решить

Graeme_Grant

Я обновил решение.

Member 13347457

Пожалуйста, я обновил свой вопрос, пожалуйста, взгляните.
Мои струны просты.

Ладно, мне очень плохо, но я попытаюсь объяснить.
Я сделал тест на той же форме ListBox, и мой код работал отлично, он работал, потому что мне не нужно было бы вызывать ListBox из другой формы, просто пока я пытался сохранить информацию, которая была на Form1 через Form2, я использовал этот файл кода". WriteAllLines (SFD. Именем, Ссылки. список. Предметы. OfType & lt;string> ());", Я теперь, как и раньше, в той же форме использовал этот "файл". WriteAllLines (SFD. Имя Файла, Список. Предметы. OfType & lt;string> ()); "

Поэтому я знаю, что ошибка при вызове списка, не работает таким образом.
Пожалуйста, если я не знаю, спросите меня еще раз, мне нужна помощь, но я не могу объяснить, мне ужасно жаль.

Graeme_Grant

Имейте прочитанный из обновления #2... Я думаю, что нашел вашу проблему...

Member 13347457

Просто продолжайте давать мне ошибку, которую я пытался разрешить, но так и не понял.
Если я поставлю эту строку кода, как вы сказали," var MyForm = Application. OpenForms [Nameof (FormVer)];", это даст ошибку в строке кода, где я вызываю ListBox, " файл. WriteAllLines (СФД".Именем, Ссылки. список. Предметы. OfType & lt;string> ());, дает точную ошибку в списке слов.
говорит, что 'form' не содержит определения для 'listbox' и в методе расширения 'ListBox' можно найти первый аргумент типа 'form'.
Что это значит?
Спасибо, что пытались мне помочь.

Graeme_Grant

Приведенный выше код скомпилирован и успешно протестирован в VS2017 & amp; .Net Framework 4.5. что вы используете?

Graeme_Grant

Я опубликовал статью о работе с JSON. Хотя я не фокусируюсь на вашей проблеме, то есть на сериализации и сохранении, она фокусируется на гораздо большем с помощью рабочего загружаемого кода, и вы можете видеть, как работает вспомогательный класс: Работа с JSON в C# и VB[^]

CPallini

5.