Как записать строки и bool в текстовый файл (через запятую) - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь сделать приложение winform. Приложение имеет 2 текстовых поля (firstName, lastName), numericUpDown и флажок. Приложение может читать из текстового файла, с разделенными запятыми строками (Daniel, Brown, 26, true). Приложение поместит эту информацию в список. Затем вы можете добавить нового пользователя. Когда вы закончите добавление пользователей, вы нажимаете сохранить, и новая информация из lisbox будет сохранена в этом текстовом файле. Я создал скрипт чтения файла и успешно добавил пользователя. Однако я не могу создать кнопку сохранения пользователя, чтобы она сохранялась: Даниэль, Браун, 26 лет, правда. Я смог сохранить как: Даниэль, Браун, 26 лет, счастлив. Вот класс Person:

public class Person
{        
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Age { get; set; }
    public bool IsHappy { get; set; }

    public override string ToString()
    {
        var statusText = IsHappy ? "happy" : "not happy";
        return $"{FirstName} {LastName} is {Age} and is {statusText}";
    }   
}

Вот файл form.cs со своим скриптом:

public partial class ChallengeForm : Form
{
    private BindingList<Person> _persons = new BindingList<Person>();
    private PersonsService _personsService;

    public ChallengeForm()
    {
        _personsService = new PersonsService();
        InitializeComponent();
        WireUpDropDown();            
    }

    private void WireUpDropDown()
    {
        _persons = new BindingList<Person>(_personsService.GetPersons(@"C:\Users\user\Desktop\Document.TXT"));
        usersListBox.DataSource = _persons;
    }

    private void addUserButton_Click(object sender, EventArgs e)
    {
        var person = new Person { FirstName = firstNameText.Text, LastName = lastNameText.Text, Age = agePicker.Text, IsHappy = isHappyCheckbox.Checked };
        _persons.Add(person);
    }

    private void saveListButton_Click(object sender, EventArgs e)
    {
    }
}

Мой вопрос: как я могу преобразовать статус обратно в bool. И запишите список в текстовый файл как csv. Я был бы очень благодарен, если бы вы могли использовать SoC. Вот что я попробовал:

const string sPath = (@"C:\Users\user\Desktop\Document.TXT");

        System.IO.StreamWriter SaveFile = new System.IO.StreamWriter(sPath);
        SaveFile.Write(myperson);
        foreach (var item in usersListBox.Items)
        {

            List<string> unwantedWords = new List<string> { "is", "and" };
            var linesSplitted = item.ToString().Split(' ').ToList();
            var wordsWithoutUnwantedWords = linesSplitted.Where(i => !unwantedWords.Contains(i)).ToList();
            for (int i = 0; i<wordsWithoutUnwantedWords.Count; i++)
            {
                var isLastWord = i == wordsWithoutUnwantedWords.Count - 1;

            SaveFile.Write(wordsWithoutUnwantedWords[i]);

                if (!isLastWord)
                {
                    SaveFile.Write(",");
                }

1 Ответ

0 голосов
/ 22 октября 2019

Просмотр XML Сериализация. Вы можете просто указать свой путь к файлу и объект, а остальное будет сделано за вас классами сериализации. Код ниже:

Это взято из удивительного ответа DeadlyDog: https://stackoverflow.com/a/22417240/1623971

/// <summary>
/// Writes the given object instance to an XML file.
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para>
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
    TextWriter writer = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        writer = new StreamWriter(filePath, append);
        serializer.Serialize(writer, objectToWrite);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

/// <summary>
/// Reads an object instance from an XML file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the XML file.</returns>
public static T ReadFromXmlFile<T>(string filePath) where T : new()
{
    TextReader reader = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        reader = new StreamReader(filePath);
        return (T)serializer.Deserialize(reader);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

Пример использования:

WriteToXmlFile<Person>("C:\someClass.txt", objectToSerialize);

// Read the file contents back into a variable.
Person deserializedObject = ReadFromXmlFile<Person>("C:\someClass.txt");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...