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

c#:在运行时创建新设置,c#,winforms,C#,Winforms,c#windows窗体:如何在运行时创建新设置,使其永久保存为设置。默认值?由于设置类是在生成时生成的(或者,实际上,每当您从设计器中更新设置文件时),因此无法将此机制用于动态场景。但是,您可以向应用程序设置中添加一些集合或字典,并动态修改这些集合或字典。如何访问您创建的新设置?VisualStudio设置设计器的要点是,您可以编写使用这些设置的代码,并对代码进行编译时检查。如果您想动态创建应用程序要使用的新设置,还需要动态加载它们。对于动态设置,您可能需要查看System.Configurat

c#windows窗体:如何在运行时创建新设置,使其永久保存为设置。默认值?

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

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


这是什么文件?Google出现在.NET上。

我知道我想要的是一个错误的想法。我把C++应用程序移植到C语言上,它有很多ini文件设置,我在寻找一个快捷方式来添加它们。我很懒。

你能做的就是创建一个新的注册表项。 将新键命名为“您的程序设置”

现在可以添加字符串标识符和值

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文件要容易得多。

您不能直接添加设置(至少在运行时不编辑配置xml),但可以伪造设置

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software", true);
ProgSettings.CreateSubKey("Your Program settings");    
ProgSettings.Close();
在我的例子中,表单上有一组相同的自定义控件,我想存储每个控件的运行时状态。我需要存储每个控件的状态,因为每个控件都有不同的数据

我创建了一个名为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中。

以防对任何人仍然重要:

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

然而,再次加载后,
settings.Default.Properties
collecion中似乎仍然缺少动态添加的设置

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

//从基本设置创建新设置:
var属性=新设置属性(Settings.Default.Properties[“”]);
property.Name=“”;
Settings.Default.Properties.Add(属性);
//将具有存储值:
var dynamicSetting=Settings.Default[“”];
我不知道微软是否支持这个主题,因为关于这个主题的文档非常少


这里还介绍了这里提供的一些解决方案(请参阅社区内容标题“如何创建/保存/加载动态(运行时)设置”)。但这是VB.NET。

除了John的保存解决方案外,正确的加载方法是添加属性,然后对设置执行重载()

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software", true);
ProgSettings.CreateSubKey("Your Program settings");    
ProgSettings.Close();
您的动态设置将在那里

对于完整示例,可在库代码中使用,因为您可以在中传递设置。

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();
}

我花了很长时间使用这里的前两个答案加上这个链接()使它最终起作用

首先,设置您的期望值。此处的答案将创建一个新的用户设置,您可以在下次启动应用程序时获取其值。但是,您以这种方式创建的设置不会显示在设置设计器中。事实上,当您重新启动应用程序并尝试在代码中访问该设置时,它将找不到。但是通过代码创建的设置保存在文件系统中的user.config文件(比如jDoe.config)中。要访问此值,必须再次添加该设置

以下是我的一个工作示例:

        private void FormPersistence_Load(object sender, EventArgs e)
        {
            StartPosition = FormStartPosition.Manual;
            // Set window location
            var exists = Settings.Default.Properties.OfType<SettingsProperty>().Any(p => p.Name == Name + "Location");
            if (exists)
            {
                this.Location = (Point)Settings.Default[Name + "Location"];
            }
            else
            {
                var property = new SettingsProperty(Settings.Default.Properties["baseLocation"]);
                property.Name = Name + "Location";
                Settings.Default.Properties.Add(property);
                Settings.Default.Reload();
                this.Location = (Point)Settings.Default[Name + "Location"];
            }
        }
private void FormPersistence\u加载(对象发送方,事件参数e)
{
StartPosition=FormStartPosition.Manual;
//设置窗口位置
var exists=Settings.Default.Properties.OfType().Any(p=>p.Name==Name+“Location”);
如果(存在)
{
this.Location=(Point)Settings.Default[Name+“Location”];
}
其他的
{
var属性=新设置属性(Settings.Default.Properties[“baseLocation”]);
property.Name=名称+位置;
Settings.Default.Properties.Add(属性);
Settings.Default.Reload();
this.Location=(Point)Settings.Default[Name+“Location”];
}
}
注: 我的新设置的名称将在运行时解析。名称实际上是这个。名称是表单的名称。这是其他表单可以继承的基础表单,因此所有子表单都能够记住它们的位置。
baseLocation是我在设置设计器中手动创建的一个设置。我拥有的新设置是相同的类型。这样我就不会