Десериализация xml

299
19 мая 2018, 14:20

Есть форма1 с кнопкой, которая вызывает форму2. На форме2 есть два чекбокса и кнопка "Сохранить". Подскажите пожалуйста, как правильно выполнить десериализацию (чтение настроек из файла xml) для значений checkBox-ов на второй форме? Код ниже работает правильно только для записи настроек в файл xml.

Класс Props:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace test
{
    public class PropsFields
    {
        public String XMLFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "settings.xml");
        public Boolean BoolValue1 = true;
        public Boolean BoolValue2 = true;
    }
    public class Props
    {
        public PropsFields Fields;
        public Props()
        {
            Fields = new PropsFields();
        }
        public void WriteXml()
        {
            XmlSerializer ser = new XmlSerializer(typeof(PropsFields));
            TextWriter writer = new StreamWriter(Fields.XMLFileName);
            ser.Serialize(writer, Fields);
            writer.Close();
        }
        public void ReadXml()
        {
            if (File.Exists(Fields.XMLFileName))
            {
                XmlSerializer ser = new XmlSerializer(typeof(PropsFields));
                TextReader reader = new StreamReader(Fields.XMLFileName);
                Fields = ser.Deserialize(reader) as PropsFields;
                reader.Close();
            }
            else
            {
                //можно написать вывод сообщения если файла не существует
            }
        }
    }
}

В первой форме:

    namespace test
    {
        public partial class Form1 : Form
        {
        Props props = new Props();
                //чтение настроек:
        private void readSetting()
        {
            props.ReadXml();
            Form2 frm2 = new Form2();
            frm2.checkBox1.Checked = props.Fields.BoolValue1;
            frm2.checkBox2.Checked = props.Fields.BoolValue2;
            frm2.Close();
            frm2.Dispose();
        }
 private void Form1_Load(object sender, EventArgs e)
{
            readSetting();
}
        private void btn_save_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            if (frm2.ShowDialog(this) == DialogResult.OK)
            {
                props.Fields.BoolValue1 = frm2.checkBox1.Checked;
                props.Fields.BoolValue2 = frm2.checkBox2.Checked;
                props.WriteXml();
            }
            frm2.Close();
            frm2.Dispose();
        }
Answer 1

При запуске программы вызывайте Settings.Load(), после чего обращайтесь к полям Settings.Current.TestField1

public class Settings
{
    private static Settings _Current;
    private Settings() { }
    public static void SetDefault()
    {
        _Current = new Settings();
    }
    public static Settings Current
    {
        get {
            if (_Current == null)
                _Current = new Settings();
            return _Current;
        }
    }
    public static void Load()
    {
        if (File.Exists(_SettingsFileName))
        {
            Stream file = File.Open(_SettingsFileName, FileMode.Open);
            XmlSerializer formatter = new XmlSerializer(typeof(Settings));
            _Current = (Settings)formatter.Deserialize(file);
            file.Close();
        }
        else
        {
            SetDefault();
            Save();
        }
    }
    public static void Save()
    {
        Stream file = File.Open(_SettingsFileName, FileMode.Create, FileAccess.Write);
        XmlSerializer formatter = new XmlSerializer(typeof(Settings));
        formatter.Serialize(file, Current);
        file.Close();
    }
    public static readonly string CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    private static string _SettingsFileName = Path.Combine(CurrentDirectory, "Settings.xml");
    public int TestField1 = 32300;
    public string TestField2 = "Hello world";

}

READ ALSO
Удалить объекты с одинаковыми полями из списка

Удалить объекты с одинаковыми полями из списка

мне нужно удалить повторяющиеся элементы, где два параметра равныУдалось удалить элементы, где повторяется только один параметр (Id), вот...

224
Уведомление View об изменении ObservableCollection.Count

Уведомление View об изменении ObservableCollection.Count

При добавлении\удалении элемента в коллекции, View не отображает изменения количества элементовТак же как и при изменении статуса в вложенном...

237
подключение OpenGL к GLFW на c#

подключение OpenGL к GLFW на c#

хотел использовать OpenGL и GLFWподключил https://github

196
Условия if else и switch

Условия if else и switch

Возможно ли такое сделать с Switch ?

201