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 に答える
3

AssemblyInfo.csファイルにアセンブリバージョンがある場合、*ビルドごとにファイルが更新されるため、それをハード番号に変更してすべてを再構築し、すべてを再テストするまで、永続性や信頼性は表示されません。

于 2016-12-21T13:22:55.503 に答える
1

電話に注意

Settings.Default.Reload();

それぞれの

Settings.Default.Save();

Save() 関数は実際に変更をファイルに保存しますが、実行中のコードには反映されません。したがって、コードは以前のバージョンのファイルのコピーを保持します。

コード内の別の場所で Save() を呼び出すと、最初の変更が上書きされ、最初の変更が効果的に元の値に戻されます。デバッグ中でも特定するのは非常に困難です。

于 2016-12-21T16:10:36.977 に答える
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 に答える
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

この場合、アプリケーションが実際にどのように機能するかをテストする必要がある場合は、exe ファイルを実行することをお勧めします。Visual Studio をデバッグ モードで実行すると、設定の保存に時間がかかります。デバッグ フォルダに移動し、exe を実行すると、期待どおりのメッセージが表示されます。

于 2013-06-02T10:06:23.037 に答える