Как сериализовать и десериализовать пользовательские данные, собранные внутри панели? - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю приложение winforms, которое позволяет пользователю вводить данные на разных панелях.Я уже написал метод для обхода панели и получения входных данных от различных элементов управления.Теперь мне нужно найти способ сериализации этих входов и десериализации их позже, чтобы все входы снова были в правильных элементах управления (например, «Jack» снова в TextBox «tbName»).

Я думализ нескольких решений, например, создание списка для каждой панели, который сериализуется в .txt со структурой, аналогичной "tbName = Jack" и так далее.Но я действительно не знаю, как бы это десериализовать, не пройдя и мои элементы управления панелью, и снова список.Или я могу сериализовать весь объект Panel вместе с дочерними элементами управления?

//This is the method I use to gather the inputs from the panels.

public IEnumerable<Control> GetControls(Control parentControl)
    {
        foreach (Control child in parentControl.Controls)
            {
                yield return child;
                foreach (Control controlChild in GetControls(child))
                {
                    yield return controlChild;
                }
            }
        }

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Для ограниченного числа элементов управления вы можете просто создать Настройки в своем проекте -> Свойства для каждого из них: enter image description here

Затем в свойстве ApplicationSettings для своего элемента управлениящелкните три точки справа от PropertyBinding ...

enter image description here

... и выберите параметр для ввода текста:

enter image description here

Теперь у вас будет это:

enter image description here

Наконец, в FormClosing() событие формы, сохраните настройки:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    Properties.Settings.Default.Save();
}
0 голосов
/ 04 января 2019

Спасибо за ответы, оба они верны и работают, но в конце концов я нашел свое собственное решение проблемы: я создал отдельный класс со всеми необходимыми мне атрибутами, как предложено @krobelusmeetsyndra, и сделалОбщий список объекта класса, который я только что сделал.Затем я прошел через элементы управления (с помощью метода из моего вопроса), поместил данные в список и сериализовал эти данные с помощью XmlSerializer.То же самое с десериализацией: я создал список моего собственного типа объекта, затем загрузил данные из XML в этом списке, а затем присвоил их нужным элементам управления.

Надеюсь, что это поможет всем с тем же вопросом!

0 голосов
/ 27 декабря 2018

Не рекомендуется сериализовать всю форму, поскольку в ней содержится много информации, которая вам не нужна (и это может повлиять на производительность).Вместо этого создайте отдельный класс, сделайте его [Serializable()], сделайте все переменные, необходимые для хранения вашей информации, и сериализуйте этот класс.

РЕДАКТИРОВАТЬ:

Скажитеу вас есть следующая форма:

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // here, you create the serializing and deserializing methods
        public void SerializingInfo()
        {
            // done however you see fit
        }

        public StorageClass DeserializingInfo()
        {
            // also done however you see fit
        }
    }
}

Затем добавьте еще один класс в ваш проект, который в моем примере называется StorageClass.Это будет выглядеть следующим образом:

namespace Test
{
    [Serializable()]
    public class StorageClass
    {
        // has all your properties
    }
}

Затем, все, что вам нужно для хранения, вы можете сделать это, установив / получив свойства в Form1.Когда вы сериализуете его, все свойства сериализуются вместе, и вы можете получить его, обратившись к их методу получения в DeserializeInfo().

...