c#:在运行时创建新设置

c #windows窗体:如何在运行时创建新设置,以便将它们永久保存为Settings.Default .– values?

以防万一对任何人都很重要:

您可以通过Settings.Default.Properties.Add(...)动态添加设置,并在保存后将这些Settings.Default.Properties.Add(...)保留在本地存储中(我将这些条目反映在漫游文件中)。

然而,再次加载后,似乎动态添加的设置在Settings.Default.Properties集合中丢失。

我可以通过在首次访问之前添加动态属性来解决此问题。 示例(请注意我从基本设置“创建”我的动态设置):

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

我不知道微软是否支持这一点,因为该主题的文档非常少见。

问题也在这里描述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。

除了John的保存解决方案之外,正确的加载方法是添加属性,然后对您的设置执行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(); } 

由于Settings类是在构建时生成的(实际上,每当您从设计器中更新设置文件时),您都无法将此机制用于动态方案。 但是,您可以向应用程序设置添加一些集合或字典,并动态修改它们。

您无法直接添加设置(至少在运行时不编辑配置XML),但您可以伪造它。

在我的例子中,我在表单上有一组相同的自定义控件,我想存储每个控件的运行时状态。 我需要存储每个控件的状态,因为每个控件都有不同的数据。

我创建了一个名为ControlData的新StringCollection设置,并将自己的数据放在那里。 然后我从该列表中加载数据并使用它来初始化我的控件。

该列表如下所示:

 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。

您可以做的是创建一个新的注册表项。 将新密钥命名为“您的程序设置”。

 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文件。

您将如何访问已创建的新设置? Visual Studio设置设计器的要点是,您可以编写使用这些设置的代码,并对代码进行编译时检查。 如果要为要使用的应用动态创建新设置,还需要动态加载它们。 对于动态设置,您可能需要查看System.Configuration程序集,尤其是ConfigurationSection 。 您可以使用该部分创建自定义配置部分,您可以将其用于动态设置添加/删除。 您可以使用ConfigurationCollection进行动态添加/删除。

INI档案嗯? 谷歌出现了这个针对.NET的INI库 。

我看到我想要的是错误的想法。 我正在将一个c ++应用程序移植到c#,它有很多ini文件设置,我正在寻找一个添加它们的快捷方式。我很懒。