С# Settings.Default.Save() не сохраняется?

эта ошибка довольно необычная. В основном мой код изменит 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. Пожалуйста помоги! Большое спасибо!

Ответы

Ответ 1

Возможно, вы допустили ту же ошибку, что и я, установив для параметра scope значение Application. Такие настройки не сохранены.

Задайте User значение .

Ответ 2

rene правильно - вам нужно вызвать Default.Reload после вызова метода Save:

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

Возможно, ошибка -?

Проводка в качестве ответа для увеличения видимости -

Ответ 3

Остерегайтесь вызова

Settings.Default.Reload();

после каждого

Settings.Default.Save();

Функция Save() фактически сохраняет ваши изменения в файле, но не отражается на вашем рабочем коде. Таким образом, ваш код хранит копию предыдущей версии файла.

Когда вы вызываете Save() в другом месте вашего кода, он записывает ваше первое изменение, эффективно возвращая ваше первое изменение обратно к исходному значению. Очень сложно фиксировать даже при отладке.

Ответ 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 ();

Ответ 5

Пожалуйста, посмотрите этот вопрос

В частности, попробуйте найти следующий код из ответа там:

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

Кроме того, проверьте этот обзор, возможно, вы столкнулись с некоторыми ограничениями, которые нелегко рассказать по вашему вопросу.

Эта статья кодекса может быть полезной.

Ответ 6

попробовал ли вы позвонить ConfigurationManager.RefreshSection, прежде чем проверять, что он получил сохраненное объявление, вы можете попробовать его снова после перезагрузки

Ответ 7

Если вам нужно протестировать ваше приложение, как реально работать в этом случае лучше запустить exe файл. Когда вы запускаете визуальную студию в режиме отладки, когда сохранение этих настроек займет некоторое время. Перейдите в папку отладки и запустите exe, вы получите сообщения, как ожидалось.

Ответ 8

Если ваш файл AssemblyInfo.cs имеет * в Assembly Assembly, то он обновляет файл для каждой сборки, поэтому вы не увидите настойчивости или надежности, пока не измените это на жесткое число и не перестройте все, а затем повторите все.

Ответ 9

У меня была та же проблема.

Чтобы решить проблему.

Перейдите в пользовательский класс в Visual Studio. Откройте класс и проверьте, существует ли метод конструктора.

Если у вас есть метод конструктора, он должен быть без параметров. Если у вас есть конструктор с параметрами, не беспокойтесь. Создайте еще один класс конструктора без параметров.

Повторите это для всех подклассов внутри класса.

Восстановить и запустить. Теперь ваши настройки должны быть сохранены.

Ответ 10

Использование 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);
}