C# ConfigurationManager没有';不保存设置

C# ConfigurationManager没有';不保存设置,c#,app-config,C#,App Config,以下是我正在使用的代码: private void SaveConfiguration() { if (txtUsername.Text != "" && txtPassword.Text != "") { ConfigurationManager.AppSettings["Username"] = txtUsername.Text; ConfigurationManager.AppSettings["Password"] = tx

以下是我正在使用的代码:

private void SaveConfiguration()
{
    if (txtUsername.Text != "" && txtPassword.Text != "")
    {
        ConfigurationManager.AppSettings["Username"] = txtUsername.Text;
        ConfigurationManager.AppSettings["Password"] = txtPassword.Text;

        MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!");
        this.Close();
    }
    else
    {
        MessageBox.Show("Por favor lleno los campos.", "Error.");
    }
}

现在,设置被保留,但当我关闭应用程序并按F5再次运行它时,这些值将恢复为在app.config文件中键入的值。有什么建议吗?

我想你应该调用Save方法

ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
编辑

为了能够保存,您必须使用OpenExeConfiguration方法返回的配置对象

//Create the object
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//make changes
config.AppSettings.Settings["Username"].Value = txtUsername.Text;
config.AppSettings.Settings["Password"].Value = txtPassword.Text;

//save to apply changes
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

使用F5运行应用程序时,此处有更多参考

  • 您的代码已编译
  • 可执行文件被复制到源代码目录的
    bin
    bin\Debug
    子目录
  • 您的
    app.config
    将作为
    yourexecutable.exe.config
    复制到该目录中,并且
  • 您的可执行文件在该目录中启动

因此,您的应用程序使用
bin
bin\Debug
目录中的
yourexecutable.exe.config
,而
ConfigurationManager
将保存更改,而不是保存在源代码目录中。部署应用程序后,这不会成为问题,因为这样,更改将转到部署目录中的
yourexecutable.exe.config
,这是您想要的。

进一步了解Appetere对第二个答案的评论:

另外请注意,如果您正在调试(并且尚未禁用vshost进程),则当应用程序停止时,您的可执行文件.vshost.exe.config将再次替换为可执行文件.exe.config

因此,再一次,您可能看不到您之后所做的任何更改!(如果您在调试时在断点处停止,并在进行修改和调用refresh部分后查看文件,您将看到所做的更改)

如果您正在调试一个程序,该程序查找一个设置,如果不存在,则写入该设置,这将非常混乱。即使预先警告您不要在第二次运行程序时期望设置在那里,也可能会在第一次运行程序之后和第二次运行之前期望设置在那里。。。唉

这没什么好担心的,因为正如其他人已经说过的那样,当应用程序部署或直接从bin启动时,这一切都会起作用


但是,如果您正在调试程序并决定第一次使用应用程序设置,并且为了避免手工编写XML,您决定从代码开始,让程序编写一个设置,那么可能会落入“陷阱”。。。要获得所有这些内容,然后可能再添加几个。

没有.Save()方法。为了使其正常工作,我必须使用config.AppSettings.Settings[“Username”]。Value=txtUsername.Text;config.AppSettings.Settings[“Password”].Value=txtPassword.Text;您的最后一行代码不正确。它应该是ConfigurationManager.RefreshSection()。配置类没有RefreshSection方法。我现在没有Visual studio来检查代码,而且有一段时间我没有使用这个类,所以我可能会出错。我以为我是从一个工作源复制/粘贴它们的,但当我发布编辑时可能会犯一些错误。您确定在正确的框架版本上测试了它吗?如果您确定我可以编辑它,您可能应该考虑使用string.IsNullOrEmpty(…)而不是将其与“”:)进行比较。谢谢,这是一个非常好的解释。如果您在调试模式下运行,它将是您的可执行文件。vshost.exe.configGreat解释!从昨天开始,我一直在想,为什么在我读到这篇文章之前,配置没有保存在原始App.config文件中。谢谢你最好有自己的文件,然后你就可以完全控制它了。这里必须提出一个问题,这一事实突出表明,内置设置文件的设计很差。另一个问题是,该名称与带有配置扩展名的exe相同。令人恼火的windows默认不显示文件扩展名意味着您的配置文件显示在客户站点上,看起来像一个exe文件。