web-dev-qa-db-ja.com

ConfigurationManagerは設定を保存しません

これが私が使用しているコードです:

private void SaveConfiguration()
{
    if (txtUsername.Text != "" && txtPassword.Text != "")
    {
        ConfigurationManager.AppSettings["Username"] = txtUsername.Text;
        ConfigurationManager.AppSettings["Password"] = txtPassword.Text;

        MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!");
        this.Close();
    }
    else
    {
        MessageBox.Show("Por favor lleno los campos.", "Error.");
    }
}

これで設定は保持されますが、アプリケーションを閉じてF5キーを押して再度実行すると、値はapp.configファイルに入力された値に戻ります。助言がありますか?

17
delete

Saveメソッドを呼び出す必要があると思います

ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

[〜#〜]編集[〜#〜]

保存できるようにするには、OpenExeConfigurationメソッドによって返される構成オブジェクトを使用する必要があります

//Create the object
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//make changes
config.AppSettings.Settings["Username"].Value = txtUsername.Text;
config.AppSettings.Settings["Password"].Value = txtPassword.Text;

//save to apply changes
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

その他の参照はこちら ConfigurationManagerクラス

51
il_guru

F5でアプリケーションを実行すると、

  • コードがコンパイルされ、
  • 実行可能ファイルは、ソースコードディレクトリのbinまたはbin\Debugサブディレクトリにコピーされます。
  • app.configyourexecutable.exe.configとしてそのディレクトリにコピーされ、
  • 実行可能ファイルはそのディレクトリで開始されます。

したがって、アプリケーションはbinまたはyourexecutable.exe.configディレクトリのbin\Debugを使用し、ConfigurationManagerが変更を保存するのはそこにです。ソースコードディレクトリにあります。これは、アプリケーションをデプロイした後は問題になりません。そうすると、変更はデプロイメントディレクトリのyourexecutable.exe.configに移動します。これは、必要なものです。

32
Heinzi

2番目の答えに関するAppetereのコメントに加えて:

また、デバッグしている場合(vshostプロセスを無効にしていない場合)、アプリケーションが停止すると、yourexecutable.vshost.exe.configが再びyourexecutable.exe.configに置き換えられることに注意してください。

したがって、もう一度、後で行った変更が表示されない場合があります。 (デバッグ中にブレークポイントで停止し、変更を加えて更新セクションを呼び出した後にファイルを調べると、変更が表示されます)。

設定を探し、存在しない場合はそれを書き込むプログラムをデバッグしている場合、これは非常に混乱します。プログラムを2回実行するときに設定が存在することを期待しないように警告されている場合でも、プログラムの最初の実行後と2回目の実行の前に設定が存在することを期待する場合があります...残念ながら!

他の人がすでに述べているように、アプリケーションがデプロイされたとき、またはbinから直接開始されたときにすべてが機能するため、心配する必要はありません...

ただし、プログラムをデバッグしていて、初めてアプリケーション設定を使用することにした場合は、「トラップ」に陥る可能性があります。また、XMLの手書きを避けるために、コードから始めてプログラムを設定を書いて...すべてのものを取得してから、さらにいくつか追加します。

0
hnodrog