C # 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 будзе паказваць «SomeValue», калі кнопка была націснутая, то ў applcation перазагружаецца і MessageBox , які паказаў, быў пусты. Аднак паўтараць працэс, націснуўшы на кнопку яшчэ раз і перазагрузкі ён пакажа «SomeValue» MessageBox . Калі ласка, дапамажыце! Вялікі дзякуй!

16
паспрабуйце перамясціць вы MessageBox ў паказаным выпадку, вашы налады могуць быць загружаны яшчэ
дададзена аўтар Sayse, крыніца
У вас ёсць файл User.config пасля захавання?
дададзена аўтар rene, крыніца
Дадаць Settings.Default.Reload (); Пасля Вашага захавання.
дададзена аўтар rene, крыніца
мне шкада, што я не разумеючы яго старанна
дададзена аўтар user1494994, крыніца

10 адказы

Можа быць, вы запускалі тую ж памылку, як я зрабіў: ўстаноўка заходзячага ў блока у Дадатак . Тыя роду налады з'яўляюцца <�моцны> не захаваны .

Усталюйце яго <�моцны> Карыстальнік , каб вырашыць гэтую праблему.

32
дададзена

Rene правільна - вам трэба выклікаць Default.Reload пасля выкліку Захаваць Метад :

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

Магчыма, памылка, -?

Праводка ў адказ, каб павысіць бачнасць -

3
дададзена

Выкарыстанне 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);
}
2
дададзена
Замест таго, каб пісаць уласны клас, можа быць, было б лепш выкарыстоўваць роднай адно: Application.UserAppDataRegistry . Некаторыя прыклады: Выкарыстанне рэестра для захоўвання дадзеных
дададзена аўтар infografnet, крыніца

Пасля поўнага дня даследаванні і вывучэння прадмета, я быў у стане вырашыць гэтую праблему, паставіўшы канфігурацыі карыстальніка:

Using System.Configuration; 

Properties.Settings.Default.strinconn = txt_stringconn.Text;
Properties.Settings.Default.Save ();
Properties.Settings.Default.Upgrade ();
MessageBox.Show ("Saved Settings");
Application.Restart ();
2
дададзена

Сцеражыцеся выкліку

Settings.Default.Reload();

after each

Settings.Default.Save();

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

Пры выкліку Save() у іншым месцы ў кодзе, ён піша на працягу першага змены, эфектыўна вяртаючыся вашым першае змены назад да зыходнага значэння. Вельмі цяжка прыціснуць нават пры адладцы.

1
дададзена

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

Для таго, каб разабрацца ў праблеме.

Перайсці да карыстацкага класа ў Visual Studio. Адкрыйце клас і праверыць, ці з'яўляецца метад канструктара.

Калі ў вас ёсць метад канструктар, ён павінен быць без параметраў. Калі ў вас ёсць канструктар з параметрамі, ня; турботай. Стварыце яшчэ адзін клас канструктара без параметраў.

Паўтарыце гэтую працэдуру для ўсіх укладзеных класаў ўнутры класа.

Перабудова і бегчы. Зараз вашы налады павінны захаваць.

1
дададзена

Вы паспрабуйце патэлефанаваць ConfigurationManager.RefreshSection Перад праверкай, што ён выратаваўся аб'яву, вы можаце паспрабаваць яго зноў пасля перазагрузкі

0
дададзена

Калі вам трэба пратэставаць прыкладанне, як на самой справе працуе ў гэтым выпадку лепш, каб запусціць выкананы файл. Пры запуску на візуальнай студыі ў рэжыме выпраўленьня пры захаванні гэтых налад спатрэбяцца некаторы час. Перайсці ў тэчку адладкі і запусціць ех вы атрымаеце паведамленні, як і варта было чакаць.

0
дададзена

Please have a look at this Question

Асабліва, паспрабуйце наступны код з адказу там:

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

Акрамя таго, праверце гэтага агляду , магчыма, вы сутыкнуліся з некаторымі абмежаваннямі, якія не так лёгка адрозніць ад вашага пытання.

This codeproject article might be of some help.

0
дададзена
дзякуй за прапанову. Як я ўжо згадваў у гэтым пытанні, я спрабаваў паўтараць працэс, націснуўшы на кнопку, і на другі перазагрузкі, то MessageBox можа паказаць значэнне ... гэта азначае, што ён быў захаваны на першым месцы.
дададзена аўтар user1494994, крыніца

Калі вашага AssemblyInfo.cs файл мае * ў версіі зборкі, то гэта асвяжае файл кожны будаваць, так што вы не будзеце бачыць сталасць і надзейнасць, пакуль вы не зменіце жорсткае лік і аднавіць усё, а затым паўторна праверыць усе.

0
дададзена
або дадаць нешта накшталт радкі AppVersion = System.Reflection.Assembly.GetExecutingAssembly() GetName() & ZWNJ; .. Version.ToString (); калі (! Settings.Default.ApplicationVersion = AppVersion) {Settings.Default.Upgrade (); Settings.Default.ApplicationVersion = AppVersion; Settings.Default.Save (); }
дададзена аўтар Alexander, крыніца