web-dev-qa-db-ja.com

ConfigurationManager.AppSettings-変更および保存方法

質問するのはささいなことかもしれませんが、私は記事で提案されているのと同じことをしますが、期待どおりに動作しません。誰かが私を正しい方向に向けることができることを願っています。

AppSettingsごとにユーザー設定を保存したいと思います。

Winformが閉じたら、これをトリガーします。

conf.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

そのため、エントリがまだ存在していない最初のときは、単純に作成します。それ以外の場合は、既存のエントリを変更します。ただし、これは保存されません。

1)私は何を間違えていますか?

2)アプリ設定のユーザー設定が再び保存されるのはどこですか?デバッグフォルダーまたはC:\ Documents and Settings\USERNAME\Local Settings\Application Dataフォルダーにありますか?

71
Houman

おそらく、設定ファイルの追加を検討する必要があります。 (例:App.Settings)このファイルを作成すると、次のことが可能になります。

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

これは、アイテムを編集してから変更できることを意味します。アイテムを強く入力すると、何よりも...展開する前にXMLに触れる必要はありません!

結果は、アプリケーションまたはユーザーのコンテキスト設定です。

設定ファイルの「新しい項目の追加」メニューを見てください。

22
Dann

App.configファイルのappSettingsセクションの値を変更する方法について:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

仕事をします。

もちろん、より良いプラクティスはSettingsクラスですが、それはあなたが何を望んでいるかに依存します。

66
Marek

私は私が遅れていることを知っています:)しかし、これは私がそれを行う方法:

public static void AddOrUpdateAppSettings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}

詳細については、 MSDN をご覧ください。

58
Wahid Bitar

<appSettings>セクションよりも<customUserSetting>セクションを優先します。 (Web)ConfigurationManagerを使用すると、読み取りと書き込みがはるかに簡単になります。 ConfigurationSection、ConfigurationElement、およびConfigurationElementCollectionでは、カスタムクラスを派生し、カスタムConfigurationPropertyプロパティを実装する必要があります。単なる日常の人間IMOには多すぎる。

次に、web.configの読み取りと書き込みの例を示します。

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

前:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

後:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
39
Tom Wilson

基本的な質問は勝利フォームに関するものなので、ここで解決策があります:(user1032413でコードを変更してwindowsForms設定を変更するだけです)新しいキーの場合:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

キーが既に存在する場合:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
23
Omid S.
public void ApplySettings(string key, string value)
{

        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
}
9
Kamil Ibadov

保存呼び出しの後にこれを追加してみてください。

ConfigurationManager.RefreshSection( "appSettings" );
7
Justin

ConfigurationManagerが使用するapp.configは1つだけであることに注意してください-スタートアッププロジェクトにあるものです。

ソリューションAにapp.configを配置し、別のソリューションBから参照する場合、Bを実行すると、Aのapp.configは無視されます。

たとえば、単体テストプロジェクトには独自のapp.configが必要です。

6
doubleloop

問題は、デバッグビジュアルスタジオで通常のexeNameを使用しないことだと思います。

indtead "NameApplication" .Host.exeを使用します

したがって、構成ファイルの名前は「NameApplication」.exe.configではなく「NameApplication」.Host.exe.configです

そして、アプリケーションを閉じた後-バックapp.configに戻ります

そのため、間違ったファイルをチェックしたり、間違った時間をチェックしたりすると、何も変わらないことがわかります。

2
chmouel kalifa

手動で変更できます:

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}
0
GalUnicode