2010-11-18 5 views
13

を保存していない私が使用しているコードです:の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ファイルに入力されたもの。助言がありますか?

+3

""と比較するのではなく、string.IsNullOrEmpty(...)を使用することを考えてください。 –

答えて

45

私はあなたが

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

EDIT

はあなたが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"); 

を返された構成オブジェクトを使用する必要が保存できるようにするには、Saveメソッドを呼び出す必要がありますだと思いますその他の参照はこちらConfigurationManager Class

+8

.Save()メソッドはありません。 –

+2

この作業を行うために、私はこれを使用しなければなりませんでした。 config.AppSettings.Settings ["Username"]。値= txtUsername.Text; config.AppSettings.Settings ["Password"]。値= txtPassword.Text; – Martin

+1

最後のコード行が正しくありません。これはConfigurationManager.RefreshSection()である必要があります。構成クラスにRefreshSectionメソッドがありません。 –

27

あなたはF5を使用してアプリケーションを実行し、

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

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

+0

ありがとう、非常に良い説明。 –

+2

デバッグモードで実行している場合、それはyourexecutable.vshost.exe.configになります – Appetere

+0

大きな説明!昨日以来、私はこれを読むまでconfigsが元のApp.configファイルに保存されない理由を迷ってきました。ありがとう! –

0

は、さらに、第2の答えにAppetereさんのコメントへ:

また、あなたがデバッグしている(とvshostプロセスを無効にしていない)アプリケーションが停止したときyourexecutable.vshost.exe.configが、その後、するかどうかということに注意してくださいもう一度yourexecutable.exe.configに置き換えてください。

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

設定を検索し、存在しない場合は書き込みを行うプログラムをデバッグすると、これは非常に混乱します。あなたがプログラムを2回目に実行することを期待することに対して予期していたとしても、プログラムの最初の実行の後、そして2回目の実行の前にそこにあることを期待するかもしれません...悲しいかな!

それは、アプリケーションがデプロイされるとき、それはすべてだけで動作しますので、心配することは何もないか、などのようなビンから直接起動すでに...

を述べている。しかし、それはあなた場合かかわらず、「罠」に陥ることは可能ですあなたのプログラムをデバッグして初めてア​​プリケーション設定を使うことを決心し、XMLを手書きで書くのを避けるためには、コードから始めてプログラムに設定を書いてみましょう。さらにいくつか追加してください。