На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Settings - что, где и как
    Часто возникает задача хранить какие-то данныев конфигах, потом быстро и безболезненно их читать, перечитывать, изменять.
    Все это очень удобно делать с помощью появившегося с .NET 2.0 средства - Settings.
    Добавить их в проект просто - Add new Item - Settings. В моем примере, я дал им красивое и наглядное имя - MySettings :)
    Нажмем OK, и что же произошло? А вот что:
    1. Появилось 3 новых файла:
    MySettings.Designer.cs
    MySettings.settings
    MySettings.cs
    2. В проекте появился новый член команды - MySettings.settings, если кликнуть по которому, появится красивый дизайнер, с помощью которого можно добавлять свои свойства для хранения.
    Каждое свойство содержит следующие критерии:
    Name - наименование свойства класса и секции конфига
    Type - тип данных (от простых типов, до собственных, лишь бы сериализоваться умели)
    Scope - тип хранения и доступа к свойству. Имеет 2 значения - User, Application, на них я остановлюсь попозже.
    Value - значение свойства (будет использоваться как значение по умолчанию)

    Создадим 2 тестовых свойства:
    NameTypeScopeValue
    MyDateDateTimeUserлюбая дата
    MyStringstringApplication"какая то строка"


    Что при этом происходит:
    Волшебным образом в проект добавился app.config (если не был до этого), видим в нем следующее:
    ExpandedWrap disabled
      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
          <configSections>
              <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                  <section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
              </sectionGroup>
              <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                  <section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
              </sectionGroup>
          </configSections>
          <userSettings>
              <ConsoleApplication3.MySettings>
                  <setting name="MyDate" serializeAs="String">
                      <value>2008-03-21</value>
                  </setting>
              </ConsoleApplication3.MySettings>
          </userSettings>
          <applicationSettings>
              <ConsoleApplication3.MySettings>
                  <setting name="MyString" serializeAs="String">
                      <value>какая то строка</value>
                  </setting>
              </ConsoleApplication3.MySettings>
          </applicationSettings>
      </configuration>

    Я думаю для тех, кто понимает xml - коментарии излишни

    Теперь зайдем в класс дизайнера и видим следующие сгеренированные нам свойства:
    ExpandedWrap disabled
      [global::System.Configuration.UserScopedSettingAttribute()]
              [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
              [global::System.Configuration.DefaultSettingValueAttribute("2008-03-21")]
              public global::System.DateTime MyDate {
                  get {
                      return ((global::System.DateTime)(this["MyDate"]));
                  }
                  set {
                      this["MyDate"] = value;
                  }
              }
              
              [global::System.Configuration.ApplicationScopedSettingAttribute()]
              [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
              [global::System.Configuration.DefaultSettingValueAttribute("какая то строка")]
              public string MyString {
                  get {
                      return ((string)(this["MyString"]));
                  }
              }

    Видно, что свойство Application Scope - есть только get, то есть его можно только читать, а User scope - есть get и set - можно читать и писать.
    Кроме этого видим установленные нами свойсва по умолчанию аттрибутами DefaultSettingValueAttribute. Хочу обратить внимание, что значения user scope свойств не хранятся в app.config, он не переписывается при вызове метода Save(), все данные хранятся в домашнем каталоге пользователя. Это значит что если в ОС есть пользователи Петя и Вася, они оба пользуются написанной нами программой - у них будут общие Default значения, а сохраненные значения User scope - у каждого свои.

    Использование наших наработок:
    ExpandedWrap disabled
      static void Main(string[] args)
              {
                  MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
                  settings.Reload();  //перечитываю из конфига реальные
                  string myStr = settings.MyString;   //достаю из конфига реальное значение
                  settings.MyDate = DateTime.Now; //устанавливаю новое значение для User Scope
                  settings.Save();    //сохраняю значения свойств User Scope
              }

    В аттаче архив с проектом, нужно переименовать расширение
    Удачи в использовании, вопросы приветствуются :)
    Прикреплённый файлПрикреплённый файлConsoleApplication3.ra_ (4.4 Кбайт, скачиваний: 211)
      От себя добавлю, что есть возможность создать "стандартные настройки проекта" - для этого надо зайти в свойства проекта, перейти там на вкладку Settings - и кликнуть на ссылку в центре появившейся страницы.

      Ещё тонкость - все созданные вами конфиги будут хранить свои настройки в одном и том же в файле App.config проекта.

      Добавлено
      Цитата PIL @
      MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
      settings.Reload(); //перечитываю из конфига реальные

      это можно сделать чуть короче, написав
      MySettings.Default
      ... А сегодня что для завтра сделал я?

      Brainbench Transcript ID#: 7848137
        очень нужная вещь, а можно добавить (удалить) свойство программно, а не в дизайнере?
        Все про компьютеры prokomputer.ru
          Можно, но для этого свойства не появится ацессора (типа Properties.Settings.Default.MyPropName).
          Придётся читать и писать в это свойство через индексатор, используя строковое имя свойства.
          Добавлять так: Properties.Settings.Default.Properties.Add("MyPropName");
          Читать\писать так: var value = Properties.Settings.Default["MyPropName"];
          ... А сегодня что для завтра сделал я?

          Brainbench Transcript ID#: 7848137
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0883 ]   [ 17 queries used ]   [ Generated: 20.11.17, 00:20 GMT ]