26

这个错误很不寻常。基本上我的代码将更改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。请帮忙!非常感谢!

4

10 回答 10

47

也许你犯了和我一样的错误:将设置设置scopeApplication. 那些设置不会被保存

设置User为解决问题。

于 2014-02-04T12:32:53.390 回答
6

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

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

可能是一个错误 - ?

作为回复发布以提高知名度 -

于 2014-09-26T00:47:02.933 回答
4

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

Using System.Configuration; 

Properties.Settings.Default.strinconn = txt_stringconn.Text;
Properties.Settings.Default.Save ();
Properties.Settings.Default.Upgrade ();
MessageBox.Show ("Saved Settings");
Application.Restart ();
于 2017-08-22T13:31:25.107 回答
3

如果您的AssemblyInfo.cs文件具有*汇编版本,那么它会在每次构建时刷新文件,因此您不会看到持久性或可靠性,直到您将其更改为硬数字并重新构建所有内容,然后重新测试所有内容。

于 2016-12-21T13:22:55.503 回答
1

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

为了避免对此感到疯狂,我决定使用注册表——为应用程序保留应用程序设置的最基本方法。推荐给大家。这是代码:

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);
}
于 2014-10-22T23:12:55.407 回答
1

小心打电话

Settings.Default.Reload();

每次之后

Settings.Default.Save();

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

当您在代码中的另一个位置调用 Save() 时,它会覆盖您的第一次更改,从而有效地将您的第一次更改恢复为原始值。即使在调试时也很难确定。

于 2016-12-21T16:10:36.977 回答
0

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

于 2013-06-02T10:06:23.037 回答
0

请看看这个问题

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

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

另外,请查看此概述,也许您遇到了一些从您的问题中不容易看出的限制。

这篇 codeproject 文章可能会有所帮助。

于 2013-06-02T09:31:18.020 回答
0

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

于 2013-06-02T09:45:08.840 回答
-2

我有同样的问题。

来解决问题。

转到 Visual Studio 中的自定义类。打开类并检查是否有构造方法。

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

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

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

于 2017-06-01T14:04:05.360 回答