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
。请帮助!很多谢谢!
也许你和我一样犯了同样的错误:将设置的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中的自定义类。打开类,检查构造函数方法是否。
如果你有一个构造方法,它应该是无参数的。如果你有一个带参数的构造函数,不用担心。创建另一个不带参数的构造函数类。
对类中的所有子类重复此操作。
重建并运行。现在你的设置应该保存了