Сохранить данные списка из двух столбцов в файл и загрузить его

#c# #listbox

#c# #список

Вопрос:

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

Любая помощь будет чрезвычайно оценена!

Комментарии:

1. Я потратил несколько дней на поиск способа сделать это. Пока я не нашел решения.

Ответ №1:

Вы могли бы заполнить свой список из пользовательского объекта и сериализовать этот объект на диск:

 using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Windows.Forms;


//Serialize an object to disk (properties must be public):

public string Serialize(Object Input, string OutFile)
{
    System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

    XmlSerializer XML = new XmlSerializer(Input.GetType());
    XML.Serialize(memoryStream, Input);

    memoryStream.Flush();
    memoryStream.Position = 0;

    if (!string.IsNullOrEmpty(OutFile))
    {
        using (FileStream fileStream = new FileStream(OutFile, FileMode.Create))
        {
            byte[] data = memoryStream.ToArray();
            fileStream.Write(data, 0, data.Length);
            fileStream.Close();
        }
    }

    return new System.IO.StreamReader(memoryStream).ReadToEnd();
}


//Deserialize from a serialized file:

    public object DeserializeFile(Type ObjectType, string FileName)
{
    Type type = typeof(object);

    if (ObjectType != null)
    { type = ObjectType; }

    using (FileStream fileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read))
    {
        StreamReader sr = new StreamReader(fileStream);
        string XML = sr.ReadToEnd();

        XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(type);
        fileStream.Close();

        return xmlSerializer.Deserialize(new StringReader(XML));
    }
}

CustomObject co = DeserializeFile(typeof(CustomObject), fileName.xml) as CustomObject;
  

Я использую этот метод для сохранения содержимого CheckedListBoxControl на диск, чтобы пользователи могли определять его с помощью своих собственных элементов.

Ответ №2:

Во-первых, отображение ваших данных и то, какие виджеты gui вы используете, совершенно не имеет значения (т. Е. То, что вы используете «список из двух столбцов», не имеет значения). Что имеет значение (в данном случае listbox), так это коллекция объектов, которая привязана к вашему listbox.

Класс collection действительно является важным элементом здесь для целей загрузки и сохранения. Его содержимое — это то, что вы будете сохранять и загружать из своего файла. Список, который отображает данные, не имеет значения; он просто отображает данные коллекции, к которой он привязан, используя любой шаблон, который вы настроили.

Итак, как вы загружаете и сохраняете, спросите вы? Вот простой пример, в котором используется двоичное форматирование. В промежуточных каналах есть миллион других переходов; просто погуглите «Сериализация C # в файл».

    public void Serialize(string filename, ObjectToSerialize objectToSerialize)
    {
       Stream stream = File.Open(filename, FileMode.Create);
       BinaryFormatter bFormatter = new BinaryFormatter();
       bFormatter.Serialize(stream, objectToSerialize);
       stream.Close();
    }

   public ObjectToSerialize DeSerialize(string filename)
    {
       ObjectToSerialize objectToSerialize;
       Stream stream = File.Open(filename, FileMode.Open);
       BinaryFormatter bFormatter = new BinaryFormatter();
       objectToSerialize = (ObjectToSerialize)bFormatter.Deserialize(stream);
       stream.Close();
       return objectToSerialize;
    }
  

Ответ №3:

Загляните в классы StreamReader и StreamWriter.

Для сохранения содержимого списка:

    using (StreamWriter tWrite = new StreamWriter(@"c:temptest.txt"))
    {
      foreach (string tItem in listBox1.Items)
      {
        tWrite.WriteLine(tItem);
      }
    }
  

Для чтения содержимого файла:

 listBox1.Items.AddRange(File.ReadAllLines(@"c:temptest.txt"));
  

Комментарии:

1. На самом деле у меня есть, но я просто не могу понять, как сохранить данные из нескольких столбцов в один файл и успешно загрузить его снова.

2. Спасибо. Это выглядит просто, и я обязательно попробую это также.