如何正确使用Properties.Settings.Default.Save()?

时间:2017-03-22 11:37:46

标签: c# winforms application-settings

我正在使用Windows Forms,.NET 4.6编写一个应用程序,使用一组可在运行时配置的设置。修改,添加和删除设置在一次运行中运行良好,但在应用关闭时所有更改都将丢失。我在主窗口关闭之前使用了Properties.Settings.Default.Save():

    private void TestersList_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.Save();
    }

在AppData中按预期创建了user.config文件,但只保存了其中一个设置,无论我使用它做什么或运行时的任何其他设置。

所有设置都在用户范围内定义,并序列化为字符串。我没有看到任何使得与其他人保存不同的人。 以下是app.config的一部分:

<userSettings>
<DailyChecklist.Properties.Settings>
    <setting name="SerialPattern2" serializeAs="String">
    <value>\d{10}_0_None</value>
  </setting>
  </setting>
  <setting name="SerialPatternDebug" serializeAs="String">
    <value>123456789</value>
  </setting>
  <setting name="TestersToIgnore" serializeAs="String">
    <value>dummy;</value>
  </setting>
  <setting name="SerialPatternDefault" serializeAs="String">
    <value>\D\d]{3}\D{2,3}\d{4}\d{5}</value>
  </setting>
  <setting name="ServerAdress" serializeAs="String">
    <value>address/goes/here</value>
  </setting>
</DailyChecklist.Properties.Settings>
</userSettings>

保存后我在user.config中得到了这个:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
    <DailyChecklist.Properties.Settings>
        <setting name="TestersToIgnore" serializeAs="String">
            <value>dummy;</value>
        </setting>
    </DailyChecklist.Properties.Settings>
</userSettings>
</configuration>

如何保存user.config中的所有设置?

提前致谢!

PS。我已经检查过它不是范围,我在汇编信息中没有'*',我监控的文件是唯一创建的文件(没有版本/内部版本号更改)。它被修改(根据notepad ++),如果我更改了TestersToIgnore,它的新值将被保存,但所有其他设置都将丢失。

1 个答案:

答案 0 :(得分:0)

嗯,我终于明白了,所以我把它留在这里为未来的不幸的灵魂。 神奇的词是:foreach

虽然可以在Properties.Settings.Default.Properties循环中迭代foreach,但更改是暂时的。我的意思是解决方案:

        foreach(SettingsProperty setting in Properties.Settings.Default.Properties)
        {
            if(setting.Name.Contains("someKeyWord"))
                Properties.Settings.Default[setting.Name] = someNewSettingValue;
        }

似乎在当前运行中正常工作,但重启后更改会丢失。由于某种原因,Properties.Settings.Default.Save()无法保存从循环中更改的所有内容。

我检查了Properties.Settings.Default[setting.Name] = someNewSettingValue;在循环之外正常工作,然后通常会保存。

如果您需要动态添加设置,请考虑使用配置为System.Collections.Specialized类型之一的单个设置。它可能会使您的代码不那么透明,但至少它可以很好地处理循环。