понедельник, 29 августа 2011 г.

Хранение настроек в XML, в C#.

Иногда требуется сохранять настройки программы не через стандартные средства C# (Properties.Settings). Это может быть связанно с разными причинами, но чаще всего для того, чтобы программа была переносима, так как стандартный механизм пишет настройки в каталоги пользователя. И если к примеру надо распространить по всему домену, то надо будет либо делать настройки дефолтными (что нельзя сделать, если к примеру на этапе разработки не развёрнут сервер и мы заранее не знаем какой у него будет адрес), либо прописывать каждому пользователю (что тоже не совсем верно). Для этого можно воспользоваться следующим подходом -

Создаем класс Props и прописываем туда следующий код


using System;
//Надо добавить для работы класса
using System.Xml.Serialization;
using System.IO;
 
namespace XMLFileSettings
{
    //Класс определяющий какие настройки есть в программе
    public class PropsFields
    {
        //Путь до файла настроек
        public String XMLFileName = System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("PROGRAM_NAME.exe", "") + "settings.xml";

        //Чтобы добавить настройку в программу просто добавьте суда строку вида - 
        //public ТИП ИМЯ_ПЕРЕМЕННОЙ = значение_переменной_по_умолчанию;
        public String TextValue = @"Testing XML File Settings";         public DateTime DateValue = new DateTime(2011, 1, 1);                 public Decimal DecimalValue = 555;         public Boolean BoolValue = 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{}         }     } }


Теперь, чтобы использовать настройки в своей программе сделаем следующее -

using System;
using System.Windows.Forms;
 
namespace XMLFileSettings
{
    public partial class Form1 : Form
    {
        #region Settings action
        Props props = new Props();
 
        //Запись настроек
        private void writeSetting()
        {
            props.Fields.TextValue = textBox1.Text;
            props.Fields.DateValue = dateTimePicker1.Value;
            props.Fields.DecimalValue = numericUpDown1.Value;
            props.Fields.BoolValue = checkBox1.Checked;
 
            props.WriteXml();
        }
 
        //Чтение настроек
        private void readSetting()
        {
            props.ReadXml();
 
            textBox1.Text = props.Fields.TextValue;
            dateTimePicker1.Value = props.Fields.DateValue;
            numericUpDown1.Value = props.Fields.DecimalValue;
            checkBox1.Checked = props.Fields.BoolValue;
        }
        #endregion
 
        #region Form Action
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            readSetting();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            writeSetting();
        }
        #endregion
    }
}


Код был написан Владимиром Павловичем , я же взял на себя смелость опубликовать его :)

Пример программы