配置文件已被C#中的另一个程序更改

时间:2015-01-20 14:10:26

标签: c# winforms app-config

我在C#Windows窗体应用程序中工作。我正在为我的申请使用2个表格。我有一个 app.config 文件来保存设置运行时间。

我在Form1中有一个按钮来打开Form2。我有一些设置要保存在Form2和Form1中。

我让我的应用运行了。在运行时,我通过Form1更新了app.config中的设置。之后,我单击按钮打开Form2并进行了一些修改,并尝试将设置保存到相同的app.config文件中。但它提出了一个例外

  

配置文件已被其他程序更改。

我无法弄明白我哪里出错了。请帮我把它搞定。 提前谢谢。

编辑1: 这是我在表单1中的功能

private void button2_Click(object sender, EventArgs e)
    {

        config1.AppSettings.Settings.Add("no_of_cameras", null);
        config1.AppSettings.Settings["no_of_cameras"].Value = (no.Value).ToString("G");
        config1.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");

        Properties.Settings.Default.Reload();
    }

这是我的表格2中的功能:

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        config2.AppSettings.Settings.Add("mail_enable", null);

        if (radioButton1.Checked == true)
        {
            label1.Show();
            textBox1.Show();
            config2.AppSettings.Settings["mail_enable"].Value = "true";
            config2.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
        else
        {
            config2.AppSettings.Settings["mail_enable"].Value = "false";
            config2.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
            textBox1.Hide();
            label1.Hide();
        }

        Properties.Settings.Default.Reload();
    }

2 个答案:

答案 0 :(得分:3)

在Save()之后,您需要销毁配置对象并重新创建它以使多个保存操作正常工作。请参阅以下代码。

表格1代码:

private void button2_Click(object sender, EventArgs e)
{
  using (Configuration config1 = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None))
  {
    config1.AppSettings.Settings.Add("no_of_cameras", null);
    config1.AppSettings.Settings["no_of_cameras"].Value = (no.Value).ToString("G");
    config1.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("appSettings");
    Properties.Settings.Default.Reload();
   }
}

Form2代码:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
  using (Configuration config2 = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None))
  {
    config2.AppSettings.Settings.Add("mail_enable", null);

    if (radioButton1.Checked == true)
    {
        label1.Show();
        textBox1.Show();
        config2.AppSettings.Settings["mail_enable"].Value = "true";
        config2.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");
    }
    else
    {
        config2.AppSettings.Settings["mail_enable"].Value = "false";
        config2.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");
        textBox1.Hide();
        label1.Hide();
    }

    Properties.Settings.Default.Reload();
  }
}

答案 1 :(得分:0)

Form 2无法覆盖app.config,因为它仍被Form 1使用(反之亦然)。因此,保存后需要使Configuration变量无效。

using语句不起作用,因为配置不是IDisposable。

表格1:

private void button2_Click(object sender, EventArgs e)
    {
        Configuration config1 = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None)

        config1.AppSettings.Settings.Add("no_of_cameras", null);
        config1.AppSettings.Settings["no_of_cameras"].Value = (no.Value).ToString("G");
        config1.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");

        Properties.Settings.Default.Reload();
        config1 = null;
    }

表格2:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        Configuration config2 = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None)

        config2.AppSettings.Settings.Add("mail_enable", null);

        if (radioButton1.Checked == true)
        {
            label1.Show();
            textBox1.Show();
            config2.AppSettings.Settings["mail_enable"].Value = "true";
            config2.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
        else
        {
            config2.AppSettings.Settings["mail_enable"].Value = "false";
            config2.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
            textBox1.Hide();
            label1.Hide();
        }

        Properties.Settings.Default.Reload();
        config2 = null;
    }