С#: создавать новые настройки во время выполнения
С# windows forms: как вы создаете новые настройки во время выполнения, чтобы они были постоянно сохранены как Settings.Default.-- values?
Ответы
Ответ 1
На всякий случай это все еще важно для любого:
Вы можете динамически добавлять настройки через 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.
Ответ 2
В дополнение к решению Джона для сохранения правильный способ загрузки - добавить свойство, а затем выполнить функцию Reload() в ваших настройках.
Ваша динамическая настройка будет там!
Для полного примера, действительного для использования в библиотечном коде, поскольку вы можете передать настройки в.
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();
}
Ответ 3
Поскольку класс настроек генерируется во время сборки (или, фактически, всякий раз, когда вы обновляете файл настроек из конструктора), этот механизм нельзя использовать для динамических сценариев. Однако вы можете добавить некоторую коллекцию или словарь в настройки приложения и динамически модифицировать их.
Ответ 4
Что вы можете сделать, так это создать новый раздел реестра.
Назовите новый ключ "Настройки вашей программы".
RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software", true);
ProgSettings.CreateSubKey("Your Program settings");
ProgSettings.Close();
Теперь вы можете добавить String Идентификаторы и значения.
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, который используется при создании настроек.
Ответ 5
Вы не можете добавлять настройки напрямую (по крайней мере, не редактируя XML файл конфигурации во время выполнения), но вы можете подделать его.
В моем случае у меня была группа идентичных пользовательских элементов управления в форме, и я хотел сохранить состояние выполнения каждого элемента управления. Мне нужно было сохранить состояние каждого элемента управления, поскольку каждый из них имел разные данные.
Я создал новый параметр StringCollection с именем ControlDatastrong > и разместил там свои собственные данные. Затем я загружаю данные из этого списка и использую его для инициализации своих элементов управления.
Список выглядит следующим образом:
Box1Text=A
Box1List=abc;def;foo;bar;
Box2Text=hello
Box2List=server1;server2;
В моем кодах запуска я просматриваю пары ключ/значение, как это:
foreach (string item in Properties.Settings.Default.ControlData) {
string[] parts=item.split('=');
части [0] будут иметь ключ, а части [1] будут иметь значение. Теперь вы можете делать вещи на основе этих данных.
Во время фазы отключения я делаю обратный, чтобы записать данные обратно в список. (Перейдите через все элементы управления в форме и добавьте их настройки в ControlData.
Ответ 6
Как вы получите доступ к новым настройкам, которые вы создали? Точка конструктора настроек Visual Studio заключается в том, что вы можете написать код, который использует эти параметры, с проверкой кода во время компиляции. Если вы хотите динамически создавать новые настройки для вашего приложения, вам также потребуется динамически их загрузить. Для динамических настроек вы можете посмотреть сборку System.Configuration, в частности ConfigurationSection. Вы можете создать настраиваемый раздел конфигурации, который вы можете использовать для добавления/удаления динамических настроек. Вы можете использовать ConfigurationCollection для динамического добавления/удаления.
Файлы INI, а? Google включил эту библиотеку INI для .NET.
Ответ 7
Я вижу, что то, что я хотел, было неправильной идеей. Я портирую С++-приложение на С#, и у него много настроек ini файла, и я искал ярлык, чтобы добавить их. Я ленив.