
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.111.121] |
![]() |
|
![]() |
Сообщ.
#1
,
|
||||||||||||
|
Часто возникает задача хранить какие-то данныев конфигах, потом быстро и безболезненно их читать, перечитывать, изменять.
Все это очень удобно делать с помощью появившегося с .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 тестовых свойства:
Что при этом происходит: Волшебным образом в проект добавился app.config (если не был до этого), видим в нем следующее: ![]() ![]() <?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 - коментарии излишни Теперь зайдем в класс дизайнера и видим следующие сгеренированные нам свойства: ![]() ![]() [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 - у каждого свои. Использование наших наработок: ![]() ![]() 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 } В аттаче архив с проектом, нужно переименовать расширение Удачи в использовании, вопросы приветствуются ![]() Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
От себя добавлю, что есть возможность создать "стандартные настройки проекта" - для этого надо зайти в свойства проекта, перейти там на вкладку Settings - и кликнуть на ссылку в центре появившейся страницы.
Ещё тонкость - все созданные вами конфиги будут хранить свои настройки в одном и том же в файле App.config проекта. Добавлено Цитата PIL @ MySettings settings = new MySettings(); //создаю с дефолтовыми значениями settings.Reload(); //перечитываю из конфига реальные это можно сделать чуть короче, написав MySettings.Default |
Сообщ.
#3
,
|
|
|
очень нужная вещь, а можно добавить (удалить) свойство программно, а не в дизайнере?
|
Сообщ.
#4
,
|
|
|
Можно, но для этого свойства не появится ацессора (типа Properties.Settings.Default.MyPropName).
Придётся читать и писать в это свойство через индексатор, используя строковое имя свойства. Добавлять так: Properties.Settings.Default.Properties.Add("MyPropName"); Читать\писать так: var value = Properties.Settings.Default["MyPropName"]; |