WinForm设置未保存。

3

我使用VSTO内置的设置文件来保存Windows应用程序的设置。

在我的WinForm上有一个复选框,当窗体加载时,我从设置文件中相应的属性中读取其状态(已选或未选)。

只要我不退出应用程序,这个方法就可以正常工作。
但是,当我退出应用程序并重新执行它时-上次执行的设置没有被保存,复选框状态也不是最后一个选项。

我使用“用户”范围来保存设置。

在窗体加载时,从设置中提取复选框状态。

private void MyFormLoad(object sender, EventArgs e)
    {  
     //Find the appropriate property in the Settings file
      System.Configuration.SettingsProperty property;  
      property = P_Settings.Settings.Default.Properties[checkBox.Name]; 

      if (property != null) 
          checkBox.Checked = Convert.ToBoolean(property.DefaultValue);
    }  

在表单关闭时,将设置文件与表单状态同步。

private void ButtonApplyClick(object sender, EventArgs e)
    {    
    System.Configuration.SettingsProperty property;  
    property = P_Settings.Settings.Default.Properties[checkBox.Name];   

    property.DefaultValue = checkBox.Checked.ToString();  
    P_Settings.Settings.Default.Save();
   }
1个回答

2
我认为DefaultValue不应该用来存储设置属性的值。它看起来更像是属性定义的一部分(在应用程序运行期间保持不变并因此被硬编码),而不像是将与设置一起保存的内容。
相反,尝试直接使用设置对象的索引器

加载:

object propValue = P_Settings.Settings.Default[checkBox.Name];
if (propValue != null) {
    checkBox.Checked = Convert.ToBoolean(propValue);
}

Saving:

P_Settings.Settings.Default[checkBox.Name] = checkBox.Checked.ToString();
P_Settings.Settings.Default.Save();

编辑:最初,您将复选框状态存储在设置属性的DefaultValue属性中。DefaultValue旨在提供默认值,如果未在存储的设置中找到设置值,则将返回该默认值。它不是将存储在设置中的值,因为它不应由用户定义或在应用程序运行期间更改。
因此,您之前尝试的内容导致了观察到的行为:您可以将一个值分配给DefaultValue,该值将保持有效,只要应用程序处于活动状态,但是该值不会在P_Settings.Settings.Default.Save()保存或在应用程序启动时恢复,因此在下次启动应用程序时,DefaultValue将再次具有其默认值(可能为null)。

非常感谢!这个完美地解决了问题!你能否再加一些进一步的解释,这样我也能明白为什么原始代码不起作用。提前谢谢! - user3165438
@user3165438:我已经添加了一个额外的解释,说明我认为发生了什么。 - O. R. Mapper
真的很有意义!非常感谢! - user3165438

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接