92

问起来可能听起来太琐碎了,我按照文章中的建议做同样的事情,但它没有按预期工作。希望有人能指出我正确的方向。

我想保存每个 AppSettings 的用户设置。

一旦 Winform 关闭,我就会触发这个:

conf.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

所以第一次当条目不存在时,它会简单地创建它,否则它会修改现有条目。但是,这并不能保存。

1)我做错了什么?

2)我希望在哪里再次保存应用程序设置的用户设置?它是在 Debug 文件夹中还是在 C:\Documents and Settings\USERNAME\Local Settings\Application Data 文件夹中?

4

9 回答 9

94

我知道我迟到了 :) 但我是这样做的:

public static void AddOrUpdateAppSettings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}

有关更多信息,请查看MSDN

于 2014-11-06T11:29:39.433 回答
72

关于如何更改 app.config 文件中 appSettings 部分的值:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

做这项工作。

当然更好的做法是设置类,但这取决于你追求什么。

于 2011-11-29T15:52:02.470 回答
41

<appSettings>更喜欢<customUserSetting>章节。使用 (Web)ConfigurationManager 读取和写入要容易得多。ConfigurationSection、ConfigurationElement 和 ConfigurationElementCollection 要求您派生自定义类并实现自定义 ConfigurationProperty 属性。对于普通的凡人IMO来说太多了。

下面是一个读写 web.config 的例子:

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

前:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

后:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
于 2012-04-12T11:47:53.677 回答
26

也许您应该考虑添加一个设置文件。(例如 App.Settings)创建此文件将允许您执行以下操作:

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

这意味着您可以编辑然后更改项目,其中项目是强类型的,最重要的是......您不必在部署之前触摸任何 xml!

结果是应用程序或用户上下文设置。

查看设置文件的“添加新项目”菜单。

于 2011-03-11T15:38:25.543 回答
23

因为基本问题是关于win forms这里是解决方案:(我刚刚将user1032413的代码更改为rflect windowsForms设置)如果它是一个新密钥:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

如果密钥已经存在:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
于 2013-12-25T13:25:08.650 回答
10

尝试在保存调用后添加它。

ConfigurationManager.RefreshSection( "appSettings" );
于 2011-03-11T17:31:26.967 回答
6

请记住,ConfigurationManager 仅使用一个 app.config - 一个在启动项目中。

如果您将一些 app.config 放入解决方案 A 并从另一个解决方案 B 中引用它,那么如果您运行 B,则来自 A 的 app.config 将被忽略。

所以例如单元测试项目应该有自己的app.config。

于 2012-12-15T01:06:34.193 回答
2

我认为问题是在调试视觉工作室中不要使用正常的 exeName。

它使用 indtead "NameApplication".host.exe

所以配置文件的名称是“NameApplication”.host.exe.config 而不是“NameApplication”.exe.config

并在应用程序关闭后 - 它返回到后面的 app.config

因此,如果您检查了错误的文件或检查了错误的时间,您将看到没有任何变化。

于 2015-08-18T00:56:47.870 回答
-1

您可以手动更改它:

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}
于 2017-08-27T09:03:42.630 回答