C# Settings.Default.Save() not saving?

本文关键字:not saving Settings Default Save | 更新日期: 2023-09-27 18:16:32

这个bug很不寻常。基本上我的代码将改变Settings.Default.Example,然后保存并重新启动程序。然后,当它加载时,它显示一个消息框。然而奇怪的是,当表单加载时,它显示一个空值。

下面是我的代码:
Main.cs
    private void Button1_Click(object sender, EventArgs e)
    {
        Settings.Default.Example = "Somevalue"; //Sets a value to the settings
        Settings.Default.Save(); // Save it
        MessageBox.Show(Settings.Default.Example); //Confirming it has been saved
        Application.Restart();
    }
    private void Main_Load(object sender, EventArgs e)
    {
        MessageBox.Show(Settings.Default.Example); // Here is the weird part, it shows empty.
    }

点击按钮后,MessageBox将显示"Somevalue",然后应用程序重启,显示的MessageBox为空。但是,通过再次单击按钮并重新启动重复该过程,它确实显示"Somevalue"MessageBox。请帮助!很多谢谢!

C# Settings.Default.Save() not saving?

也许你和我一样犯了同样的错误:将设置的scope设置为 Application 。这些设置是而不是 saved

设置为 User 解决问题

如果你的AssemblyInfo.cs文件在汇编版本中有一个*,那么它每次构建都会刷新文件,所以你不会看到持久性或可靠性,直到你将其更改为硬数字并重建所有,然后重新测试一切

rene是正确的-您需要在调用Save方法后调用Default.Reload:

Settings.Default.Save();
Settings.Default.Reload();

可能是bug - ?

作为回复发布以增加可见度-

经过一整天的研究和研究,我能够通过向用户提供配置来解决这个问题:

Using System.Configuration; 
Properties.Settings.Default.strinconn = txt_stringconn.Text;
Properties.Settings.Default.Save ();
Properties.Settings.Default.Upgrade ();
MessageBox.Show ("Saved Settings");
Application.Restart ();

使用Visual Studio 2013 -没有什么我可以做的,使它可靠地工作,我将调用保存,它没有保存。保存然后立即重新加载,它仍然不会在后续运行中保留值(可能与我停止调试时无法确定根本原因有关)-非常令人沮丧,可能存在潜在的错误,但我无法证明它。

为了避免变得疯狂,我决定使用注册表——保存应用程序设置的最基本方式。推荐给大家。下面是代码:

public static class RegistrySettings
{
private static RegistryKey baseRegistryKey = Registry.CurrentUser;
private static string _SubKey = string.Empty;
public static string SubRoot 
{
    set
    { _SubKey = value; }
}
public static string Read(string KeyName, string DefaultValue)
{
    // Opening the registry key 
    RegistryKey rk = baseRegistryKey;
    // Open a subKey as read-only 
    RegistryKey sk1 = rk.OpenSubKey(_SubKey);
    // If the RegistrySubKey doesn't exist return default value
    if (sk1 == null)
    {
        return DefaultValue;
    }
    else
    {
        try
        {
            // If the RegistryKey exists I get its value 
            // or null is returned. 
            return (string)sk1.GetValue(KeyName);
        }
        catch (Exception e)
        {
            ShowErrorMessage(e, String.Format("Reading registry {0}", KeyName.ToUpper()));
            return null;
        }
    }
}
public static bool Write(string KeyName, object Value)
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey;
        // I have to use CreateSubKey 
        // (create or open it if already exits), 
        // 'cause OpenSubKey open a subKey as read-only
        RegistryKey sk1 = rk.CreateSubKey(_SubKey);
        // Save the value
        sk1.SetValue(KeyName, Value);
        return true;
    }
    catch (Exception e)
    {
        ShowErrorMessage(e, String.Format("Writing registry {0}", KeyName.ToUpper()));
        return false;
    }
}
private static void ShowErrorMessage(Exception e, string Title)
{
    if (ShowError == true)
        MessageBox.Show(e.Message,
                Title
                , MessageBoxButtons.OK
                , MessageBoxIcon.Error);
}
}

用法:

private void LoadDefaults()
{
    RegistrySettings.SubRoot = "Software''Company''App";
    textBoxInputFile.Text = RegistrySettings.Read("InputFileName");
}
private void SaveDefaults()
{
    RegistrySettings.SubRoot = "Software''Company''App";
    RegistrySettings.Write("InputFileName", textBoxInputFile.Text);
}

小心调用

Settings.Default.Reload();
每个<<p>在/strong>
Settings.Default.Save();

Save()函数实际上将您的更改保存到文件中,但它不会反映到您正在运行的代码中。因此,您的代码将保留文件的前一个版本的副本。

当您在代码中的另一个位置调用Save()时,它会重写您的第一个更改,有效地将您的第一个更改还原回原始值。即使在调试时也很难确定。

请看这个问题

特别是,从那里的答案中尝试以下代码:

using System.Configuration;  // Add a reference to System.Configuration.dll
...
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;

另外,看看这个概述,也许你遇到了一些限制,从你的问题中不容易看出。

您是否在检查ConfigurationManager.RefreshSection是否已保存之前尝试调用它,您可以在重新加载后再次尝试

如果您需要测试您的应用程序如何在这种情况下实际工作,最好运行exe文件。当您在visual studio调试模式下运行时,保存这些设置将需要一些时间。转到调试文件夹并运行exe,您将得到预期的消息

我也遇到了同样的问题。

解决问题。

进入Visual Studio中的自定义类。打开类,检查构造函数方法是否。

如果你有一个构造方法,它应该是无参数的。如果你有一个带参数的构造函数,不用担心。创建另一个不带参数的构造函数类。

对类中的所有子类重复此操作。

重建并运行。现在你的设置应该保存了