Как сохранить настройки приложения в приложении Windows Forms? - PullRequest
544 голосов
/ 17 января 2009

То, чего я хочу достичь, очень просто: у меня есть приложение Windows Forms (.NET 3.5), которое использует путь для чтения информации. Этот путь может быть изменен пользователем с помощью формы параметров, которую я предоставляю.

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

Я понимаю, что доступны три варианта:

  • Файл настроек конфигурации (appname.exe.config)
  • Registry
  • Пользовательский XML-файл

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

Значит ли это, что мне следует использовать собственный XML-файл для сохранения настроек конфигурации? Если так, я хотел бы видеть пример кода этого (C #).

Я видел другие дискуссии на эту тему, но мне все еще неясно.

Ответы [ 13 ]

3 голосов
/ 17 января 2009

Насколько я могу судить, .NET поддерживает сохранение настроек с помощью встроенного средства настройки приложения:

Функция «Настройки приложения» в Windows Forms позволяет легко создавать, хранить и поддерживать пользовательские настройки приложений и пользователей на клиентском компьютере. В настройках приложения Windows Forms вы можете хранить не только данные приложения, такие как строки подключения к базе данных, но также данные, относящиеся к конкретному пользователю, например настройки приложения пользователя. Используя Visual Studio или пользовательский управляемый код, вы можете создавать новые настройки, считывать их и записывать на диск, связывать их со свойствами в формах и проверять данные настроек перед загрузкой и сохранением. - http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

2 голосов
/ 23 декабря 2013

Иногда вы хотите избавиться от тех настроек, которые хранятся в традиционном файле web.config или app.config. Вы хотите более детальный контроль над развертыванием записей настроек и отдельным дизайном данных. Или требуется включить добавление новых записей во время выполнения.

Я могу представить два хороших варианта:

  • Строго типизированная версия и
  • Объектно-ориентированная версия.

Преимуществом строго типизированной версии являются строго типизированные имена и значения настроек. Нет риска смешивания имен или типов данных. Недостатком является то, что необходимо закодировать больше параметров, которые нельзя добавить во время выполнения.

В объектно-ориентированной версии преимущество заключается в том, что новые параметры могут быть добавлены во время выполнения. Но у вас нет строго типизированных имен и значений. Нужно быть осторожным со строковыми идентификаторами. Должен знать тип данных, сохраненный ранее при получении значения.

Вы можете найти код обеих полнофункциональных реализаций ЗДЕСЬ .

1 голос
/ 27 июля 2016
public static class SettingsExtensions
{
    public static bool TryGetValue<T>(this Settings settings, string key, out T value)
    {
        if (settings.Properties[key] != null)
        {
            value = (T) settings[key];
            return true;
        }

        value = default(T);
        return false;
    }

    public static bool ContainsKey(this Settings settings, string key)
    {
        return settings.Properties[key] != null;
    }

    public static void SetValue<T>(this Settings settings, string key, T value)
    {
        if (settings.Properties[key] == null)
        {
            var p = new SettingsProperty(key)
            {
                PropertyType = typeof(T),
                Provider = settings.Providers["LocalFileSettingsProvider"],
                SerializeAs = SettingsSerializeAs.Xml
            };
            p.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
            var v = new SettingsPropertyValue(p);
            settings.Properties.Add(p);
            settings.Reload();
        }
        settings[key] = value;
        settings.Save();
    }
}
...