c #: создавать новые настройки во время выполнения - PullRequest
18 голосов
/ 06 октября 2008

c # оконные формы: как создавать новые настройки во время выполнения, чтобы они постоянно сохранялись как Settings.Default .-- значения?

Ответы [ 7 ]

17 голосов
/ 30 сентября 2011

На всякий случай, если это все еще имеет значение для кого-либо:

Вы можете динамически добавлять настройки через Settings.Default.Properties.Add(...), и они также сохраняются в локальном хранилище после сохранения (эти записи были отражены в файле роуминга).

Тем не менее, кажется, что динамически добавленные настройки по-прежнему отсутствуют в коллекции Settings.Default.Properties после повторной загрузки.

Я мог бы обойти эту проблему, добавив динамическое свойство перед первым доступом к нему. Пример (обратите внимание, что я «создаю» свою динамическую настройку из базовой настройки):

// create new setting from a base setting:
var property = new SettingsProperty(Settings.Default.Properties["<baseSetting>"]);
property.Name = "<dynamicSettingName>";
Settings.Default.Properties.Add(property);
// will have the stored value:
var dynamicSetting = Settings.Default["<dynamicSettingName>"];

Я не знаю, поддерживается ли это Microsoft, поскольку документация по этой теме встречается очень редко.

Проблема также описана здесь http://www.vbdotnetforums.com/vb-net-general-discussion/29805-my-settings-run-time-added-properties-dont-save.html#post88152 с некоторым решением, предлагаемым здесь http://msdn.microsoft.com/en-us/library/saa62613(v=VS.100).aspx (см. Содержимое сообщества - заголовок "Как создать / сохранить / загрузить динамические (во время выполнения) настройки"). Но это VB.NET.

15 голосов
/ 14 мая 2012

В дополнение к решению Джона для сохранения, правильный способ загрузки - добавить свойство, а затем выполнить перезагрузку () в ваших настройках.

Ваша динамическая настройка будет там!

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

ApplicationSettingsBase settings = passed_in;
SettingsProvider sp = settings.Providers["LocalFileSettingsProvider"];
SettingsProperty p = new SettingsProperty("your_prop_name");
your_class conf = null;
p.PropertyType = typeof( your_class );
p.Attributes.Add(typeof(UserScopedSettingAttribute),new UserScopedSettingAttribute());
p.Provider = sp;
p.SerializeAs = SettingsSerializeAs.Xml;
SettingsPropertyValue v = new SettingsPropertyValue( p );
settings.Properties.Add( p );

settings.Reload();
conf = (your_class)settings["your_prop_name"];
if( conf == null )
{
   settings["your_prop_name"] = conf = new your_class();
   settings.Save();
}
7 голосов
/ 06 октября 2008

Поскольку класс Settings создается во время сборки (или фактически при каждом обновлении файла настроек из конструктора), вы не можете использовать этот механизм для динамических сценариев. Однако вы можете добавить некоторую коллекцию или словарь в настройки приложения и динамически изменять их.

2 голосов
/ 27 января 2010

Вы не можете добавлять настройки напрямую (по крайней мере, не редактируя XML-файл конфигурации во время выполнения), но вы можете подделать его.

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

Я создал новый параметр StringCollection с именем ControlData и поместил туда свои собственные данные. Затем я загружаю данные из этого списка и использую их для инициализации своих элементов управления.

Список выглядит так:

Box1Text=A
Box1List=abc;def;foo;bar;
Box2Text=hello
Box2List=server1;server2;

В моем коде запуска я читаю пары ключ / значение следующим образом:

foreach (string item in Properties.Settings.Default.ControlData) {
  string[] parts=item.split('=');

parts [0] будет иметь ключ, а parts [1] будет иметь значение. Теперь вы можете делать вещи на основе этих данных.

Во время фазы выключения я делаю обратное, чтобы записать данные обратно в список. (Переберите все элементы управления в форме и добавьте их настройки в ControlData.

2 голосов
/ 06 августа 2009

Что вы можете сделать, это создать новый раздел реестра. Назовите новый ключ «Настройки вашей программы».

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software", true);
ProgSettings.CreateSubKey("Your Program settings");    
ProgSettings.Close();

Теперь вы можете добавлять строковые идентификаторы и значения.

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software\\Your Program settings", true);
ProgSettings.SetValue("Setting Name", value); // store settings    
string settings = ProgSettings.GetValue("Setting Name", false); // retreave settings    
ProgSettings.DeleteValue("Setting Name", false);

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

Многие коммерческие приложения используют эти методы. У stackoverflow есть много примеров записи и чтения в реестр. Это намного проще, чем изменять файл appconfig.xml, который используется при создании настроек.

1 голос
/ 06 октября 2008

Как бы вы получили доступ к новым настройкам, которые вы создали? Смысл дизайнера настроек Visual Studio в том, что вы можете написать код, который использует эти настройки, с проверкой вашего кода во время компиляции. Если вы хотите динамически создавать новые настройки для вашего приложения, вам также нужно будет их динамически загружать. Для динамических настроек вы можете посмотреть сборку System.Configuration, а именно: ConfigurationSection . Вы можете создать пользовательский раздел конфигурации, который вы можете использовать для добавления / удаления динамических настроек. Для этого динамического добавления / удаления вы можете использовать ConfigurationCollection .

INI-файлы, а? Google обнаружил эту библиотеку INI для .NET.

0 голосов
/ 06 октября 2008

Я вижу, что то, что я хотел, было неверной идеей. Я портирую приложение c ++ на c #, и в нем много настроек ini-файлов, и я искал ярлык для их добавления. Я ленивый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...