Ответ 1
Возможно, вы допустили ту же ошибку, что и я, установив для параметра scope
значение Application
. Такие настройки не сохранены.
Задайте User
значение .
эта ошибка довольно необычная. В основном мой код изменит 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
будет отображаться "Некоторое значение", после чего приложение будет перезапущено, а показанное MessageBox
будет пустым. Однако повторение процесса, нажав кнопку еще раз и перезапустив его, показывает "Somevalue" MessageBox
. Пожалуйста помоги! Большое спасибо!
Возможно, вы допустили ту же ошибку, что и я, установив для параметра scope
значение Application
. Такие настройки не сохранены.
Задайте User
значение .
rene правильно - вам нужно вызвать Default.Reload
после вызова метода Save
:
Settings.Default.Save();
Settings.Default.Reload();
Возможно, ошибка -?
Проводка в качестве ответа для увеличения видимости -
Остерегайтесь вызова
Settings.Default.Reload();
после каждого
Settings.Default.Save();
Функция Save() фактически сохраняет ваши изменения в файле, но не отражается на вашем рабочем коде. Таким образом, ваш код хранит копию предыдущей версии файла.
Когда вы вызываете Save() в другом месте вашего кода, он записывает ваше первое изменение, эффективно возвращая ваше первое изменение обратно к исходному значению. Очень сложно фиксировать даже при отладке.
После целого дня исследования и изучения предмета я смог решить эту проблему, поставив Конфигурацию пользователю:
Using System.Configuration;
Properties.Settings.Default.strinconn = txt_stringconn.Text;
Properties.Settings.Default.Save ();
Properties.Settings.Default.Upgrade ();
MessageBox.Show ("Saved Settings");
Application.Restart ();
Пожалуйста, посмотрите этот вопрос
В частности, попробуйте найти следующий код из ответа там:
using System.Configuration; // Add a reference to System.Configuration.dll
...
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
Кроме того, проверьте этот обзор, возможно, вы столкнулись с некоторыми ограничениями, которые нелегко рассказать по вашему вопросу.
Эта статья кодекса может быть полезной.
попробовал ли вы позвонить ConfigurationManager.RefreshSection
, прежде чем проверять, что он получил сохраненное объявление, вы можете попробовать его снова после перезагрузки
Если вам нужно протестировать ваше приложение, как реально работать в этом случае лучше запустить exe файл. Когда вы запускаете визуальную студию в режиме отладки, когда сохранение этих настроек займет некоторое время. Перейдите в папку отладки и запустите exe, вы получите сообщения, как ожидалось.
Если ваш файл AssemblyInfo.cs
имеет *
в Assembly Assembly, то он обновляет файл для каждой сборки, поэтому вы не увидите настойчивости или надежности, пока не измените это на жесткое число и не перестройте все, а затем повторите все.
У меня была та же проблема.
Чтобы решить проблему.
Перейдите в пользовательский класс в Visual Studio. Откройте класс и проверьте, существует ли метод конструктора.
Если у вас есть метод конструктора, он должен быть без параметров. Если у вас есть конструктор с параметрами, не беспокойтесь. Создайте еще один класс конструктора без параметров.
Повторите это для всех подклассов внутри класса.
Восстановить и запустить. Теперь ваши настройки должны быть сохранены.
Использование 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);
}