Реализация AppSettings для .NET Compact Framework

Вступление

На данный момент .NET Compact Framework не содержит класс AppSettings, позволяющий сохранять настройки, как в полной версии .NET Framework, где разработчик может получить доступ к настройкам, которые хранятся в файле App.Config через класс System.Configuration.ConfigurationSettings.AppSettings. Попробуем самостоятельно создать подобную функциональность.

Пишем код

Настройки мы будем хранить в XML-файле в том же формате, как это принято в файле App.Config.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="ServerIP" value="192.168.5.22" />
        <add key="UserName" value="testuser" />
        <add key="Password" value="jdhs822@@*" />
        <add key="PhoneNumber" value="5555555555" />
        <add key="TimeOut" value="60" />
        <add key="LastTransmit" value="03/03/2004 9:12:33 PM" />
        <add key="DatabasePath" value="\Program Files\DB\test.sdf" />
    </appSettings>
</configuration>

Назовем этот файл Settings.xml и добавим его в проект. Далее создадим новый класс Settings. Данный класс содержит только статические члены, чтобы можно было легко получить данные настроек из файла. Чтобы сразу получить значения, создадим статический конструктор, в котором будет происходить обработка XML-кода. Для начала объявим переменную m_settings типа NameValueCollection, которая будет хранить все настройки.


public class Settings
{
    private static NameValueCollection m_settings;
    private static string m_settingsPath;

    // Static constructor
    static Settings()
    {
        // Получим путь к файлу настроек
        m_settingsPath = Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
        m_settingsPath += @"\Settings.xml";

        if(!File.Exists(m_settingsPath))
            throw new FileNotFoundException(
                              m_settingsPath + " не найден.");

        System.Xml.XmlDocument xdoc = new XmlDocument();
        xdoc.Load(m_settingsPath);
        XmlElement root = xdoc.DocumentElement;
        System.Xml.XmlNodeList nodeList = root.ChildNodes.Item(0).ChildNodes;

        // Добавляем настройки в NameValueCollection.
        m_settings = new NameValueCollection();
        m_settings.Add("ServerIP", nodeList.Item(0).Attributes["value"].Value);
        m_settings.Add("UserName", nodeList.Item(1).Attributes["value"].Value);
        m_settings.Add("Password", nodeList.Item(2).Attributes["value"].Value);
        m_settings.Add("PhoneNumber",
                                  nodeList.Item(3).Attributes["value"].Value);
        m_settings.Add("TimeOut", nodeList.Item(4).Attributes["value"].Value);
        m_settings.Add("LastTransmit",
                                  nodeList.Item(5).Attributes["value"].Value);
        m_settings.Add("DatabasePath",
                                  nodeList.Item(6).Attributes["value"].Value);
    }
}

Теперь, нам нужно создать несколько свойств для получения и установки значений в NameValueCollection.


public static string ServerIP
{
    get { return m_settings.Get("ServerIP"); }
    set { m_settings.Set("ServerIP", value); }
}

public static string UserName
{
    get { return m_settings.Get("UserName"); }
    set { m_settings.Set("UserName", value); }
}
// ... и так далее

После того, как мы заведем новые настройки, необходимо сохранить их в файле. Для этого добавим в класс еще один метод Update(). Класс XmlTextWriter позволяет легко записать xml-код в FileStream. Проходим через все значения NameValueCollection и сохраняем значения настроек в xml-файле.


public static void Update()
{
    XmlTextWriter tw = new XmlTextWriter(m_settingsPath,
                                       System.Text.UTF8Encoding.UTF8);
    tw.WriteStartDocument();
    tw.WriteStartElement("configuration");
    tw.WriteStartElement("appSettings");

    for(int i=0; i < m_settings.Count; ++i)
    {
        tw.WriteStartElement("add");
        tw.WriteStartAttribute("key", string.Empty);
        tw.WriteRaw(m_settings.GetKey(i));
        tw.WriteEndAttribute();

        tw.WriteStartAttribute("value", string.Empty);
        tw.WriteRaw(m_settings.Get(i));
        tw.WriteEndAttribute();
        tw.WriteEndElement();
    }

    tw.WriteEndElement();
    tw.WriteEndElement();

    tw.Close();
}

Теперь мы можем легко сохранять и извлекать пользовательские настройки. Очень часто извлечение значений настроек происходит при загрузке приложения, а сохранение при закрытии.


private void MainForm_Load(object sender, EventArgs e)
{
    textBox1.Text = Settings.UserName;
}

private void MainForm_Closed(object sender, EventArgs e)
{
    Settings.UserName = textBox1.Text;
    Settings.Update(); // сохраняем новые настройки в файле
}

Скачать пример

Источник: http://www.codeproject.com/KB/mobile/SaveSettings.aspx

Перевод: Александр Климов

Реклама

модульная мебель для детской комнаты, рейтинг статья; Оптовый склад в Москве, отличный способ формирования корпоративного стиля купить одежду оптом .