質問するのはささいなことかもしれませんが、私は記事で提案されているのと同じことをしますが、期待どおりに動作しません。誰かが私を正しい方向に向けることができることを願っています。
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フォルダーにありますか?
おそらく、設定ファイルの追加を検討する必要があります。 (例:App.Settings)このファイルを作成すると、次のことが可能になります。
string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";
これは、アイテムを編集してから変更できることを意味します。アイテムを強く入力すると、何よりも...展開する前にXMLに触れる必要はありません!
結果は、アプリケーションまたはユーザーのコンテキスト設定です。
設定ファイルの「新しい項目の追加」メニューを見てください。
App.configファイルのappSettingsセクションの値を変更する方法について:
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
仕事をします。
もちろん、より良いプラクティスはSettingsクラスですが、それはあなたが何を望んでいるかに依存します。
私は私が遅れていることを知っています:)しかし、これは私がそれを行う方法:
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 をご覧ください。
<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>
基本的な質問は勝利フォームに関するものなので、ここで解決策があります:(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);
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);
}
保存呼び出しの後にこれを追加してみてください。
ConfigurationManager.RefreshSection( "appSettings" );
ConfigurationManagerが使用するapp.configは1つだけであることに注意してください-スタートアッププロジェクトにあるものです。
ソリューションAにapp.configを配置し、別のソリューションBから参照する場合、Bを実行すると、Aのapp.configは無視されます。
たとえば、単体テストプロジェクトには独自のapp.configが必要です。
問題は、デバッグビジュアルスタジオで通常のexeNameを使用しないことだと思います。
indtead "NameApplication" .Host.exeを使用します
したがって、構成ファイルの名前は「NameApplication」.exe.configではなく「NameApplication」.Host.exe.configです
そして、アプリケーションを閉じた後-バックapp.configに戻ります
そのため、間違ったファイルをチェックしたり、間違った時間をチェックしたりすると、何も変わらないことがわかります。
手動で変更できます:
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);
}