这可能听起来太琐事了,而且我做了与文章中建议相同的事情,但它没有按预期工作。希望有人能指出我正确的方向。
我想保存每个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文件夹中?
答案 0 :(得分:65)
关于如何更改app.config文件中appSettings部分中的值:
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
完成这项工作。
当然,更好的做法是设置类,但这取决于你追求的是什么。
答案 1 :(得分:55)
我知道我迟到了:)但是我这样做了:
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
答案 2 :(得分:39)
首选<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>
答案 3 :(得分:23)
因为基本问题是关于win表格的解决方案: (我刚用user1032413更改了代码以反映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);
答案 4 :(得分:22)
也许您应该考虑添加设置文件。 (例如App.Settings) 创建此文件将允许您执行以下操作:
string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";
这意味着您可以编辑然后更改项目,其中项目是强类型的,最重要的是......在部署之前,您不必触摸任何xml!
结果是应用程序或用户上下文设置。
查看设置文件的“添加新项目”菜单。
答案 5 :(得分:9)
public void ApplySettings(string key, string value)
{
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);
}
答案 6 :(得分:7)
尝试在保存电话后添加此内容。
ConfigurationManager.RefreshSection( "appSettings" );
答案 7 :(得分:6)
请记住,ConfigurationManager只使用一个app.config - 一个在启动项目中。
如果你将一些app.config放到解决方案A并从另一个解决方案B中引用它,那么如果你运行B,将忽略来自A的app.config。
因此,例如,单元测试项目应该有自己的app.config。
答案 8 :(得分:2)
我认为问题是在调试Visual Studio中不要使用普通的exeName。
它使用indtead“NameApplication”.host.exe
所以配置文件的名称是“NameApplication”.host.exe.config而不是 “NameApplication名为” .exe.config
在应用程序关闭后 - 它返回到后面的app.config
因此,如果您检查错误的文件或检查错误的时间,您将看到没有任何更改。
答案 9 :(得分:0)
您可以手动更改:
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);
}