web-dev-qa-db-ja.com

c#:実行時に新しい設定を作成する

c#Windowsフォーム:実行時に新しい設定を作成して、Settings.Default .--値として永続的に保存するにはどうすればよいですか?

18
Paul

それでも誰にとっても重要な場合に備えて:

Settings.Default.Properties.Add(...)を使用して設定を動的に追加し、保存後にこれらの設定をローカルストレージに保持することもできます(これらのエントリをローミングファイルに反映させました)。

それにもかかわらず、動的に追加された設定は、再度ロードした後もSettings.Default.Propertiesコレクションに表示されないようです。

最初にアクセスする前に動的プロパティを追加することで、この問題を回避できます。例(基本設定から動的設定を「作成」することに注意してください):

// create new setting from a base setting:
var property = new SettingsProperty(Settings.Default.Properties["<baseSetting>"]);
property.Name = "<dynamicSettingName>";
Settings.Default.Properties.Add(property);
// will have the stored value:
var dynamicSetting = Settings.Default["<dynamicSettingName>"];

このトピックに関するドキュメントは非常にまれであるため、これがMicrosoftによってサポートされているかどうかはわかりません。

問題についてもここで説明します http://www.vbdotnetforums.com/vb-net-general-discussion/29805-my-settings-run-time-added-properties-dont-save.html#post88152 =ここで提供されるいくつかのソリューションを使用 http://msdn.Microsoft.com/en-us/library/saa62613(v = VS.100).aspx (コミュニティコンテンツ-見出し「作成方法/動的(実行時)設定の保存/ロード」)。しかし、これはVB.NETです。

17
John

Johnの保存ソリューションに加えて、ロードするための適切なメソッドは、プロパティを追加してから、設定に対してReload()を実行することです。

あなたのダイナミックな設定がそこにあります!

完全な例として、。で設定を渡すことができるため、ライブラリコードでの使用に有効です。

ApplicationSettingsBase settings = passed_in;
SettingsProvider sp = settings.Providers["LocalFileSettingsProvider"];
SettingsProperty p = new SettingsProperty("your_prop_name");
your_class conf = null;
p.PropertyType = typeof( your_class );
p.Attributes.Add(typeof(UserScopedSettingAttribute),new UserScopedSettingAttribute());
p.Provider = sp;
p.SerializeAs = SettingsSerializeAs.Xml;
SettingsPropertyValue v = new SettingsPropertyValue( p );
settings.Properties.Add( p );

settings.Reload();
conf = (your_class)settings["your_prop_name"];
if( conf == null )
{
   settings["your_prop_name"] = conf = new your_class();
   settings.Save();
}
15
Drew Ogle

Settingsクラスはビルド時に生成されるため(または、実際には、デザイナー内から設定ファイルを更新するたびに)、動的シナリオにこのメカニズムを使用することはできません。ただし、コレクションまたはディクショナリをアプリケーション設定に追加して、動的に変更することはできます。

7
OregonGhost

設定を直接追加することはできませんが(少なくとも実行時に構成XMLを編集しない限り)、偽造することはできます。

私の場合、フォームに同一のカスタムコントロールのグループがあり、各コントロールの実行時の状態を保存したいと思いました。それぞれが異なるデータを持っていたので、私は各コ​​ントロールの状態を保存する必要がありました。

ControlDataという名前の新しいStringCollection設定を作成し、そこに独自のデータを配置しました。次に、そのリストからデータをロードし、それを使用してコントロールを初期化します。

リストは次のようになります。

Box1Text=A
Box1List=abc;def;foo;bar;
Box2Text=hello
Box2List=server1;server2;

スタートアップコードでは、次のようにキーと値のペアを読み通しました。

foreach (string item in Properties.Settings.Default.ControlData) {
  string[] parts=item.split('=');

parts [0]にはキーがあり、parts [1]には値があります。これで、このデータに基づいて作業を行うことができます。

シャットダウンフェーズでは、逆の操作を行ってデータをリストに書き戻します。 (フォーム内のすべてのコントロールを反復処理し、それらの設定をControlDataに追加します。

2
Tom Wilson

あなたができることは、新しいレジストリキーを作成することです。新しいキーに「プログラム設定」という名前を付けます。

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software", true);
ProgSettings.CreateSubKey("Your Program settings");    
ProgSettings.Close();

これで、文字列識別子と値を追加できます。

RegistryKey ProgSettings = Registry.CurrentUser.OpenSubKey("Software\\Your Program settings", true);
ProgSettings.SetValue("Setting Name", value); // store settings    
string settings = ProgSettings.GetValue("Setting Name", false); // retreave settings    
ProgSettings.DeleteValue("Setting Name", false);

レジストリに書き込む可能性のあるプログラムの他の部分との競合を避けるために、完了したら必ずレジストリキーを閉じてください。

多くの商用ソフトウェアアプリケーションはこれらの方法を使用しています。 stackoverflowには、レジストリへの書き込みと読み取りに関する多くの例があります。これは、設定の作成時に使用されるappconfig.xmlファイルを変更するよりもはるかに簡単です。

2
RICK

作成した新しい設定にどのようにアクセスしますか? Visual Studio設定デザイナーのポイントは、コードのコンパイル時チェックでこれらの設定を使用するコードを記述できることです。アプリで使用する新しい設定を動的に作成する場合は、それらを動的にロードする必要もあります。動的設定の場合は、System.Configurationアセンブリ、特に ConfigurationSection を確認することをお勧めします。それを使用してカスタム構成セクションを作成し、動的設定の追加/削除に使用できます。その動的な追加/削除には ConfigurationCollection を使用できます。

INIファイルえ?グーグルは this INI library for.NET。

1

私が欲しかったのは間違った考えだったことがわかります。私はc ++アプリをc#に移植していますが、多くのiniファイル設定があり、それらを追加するためのショートカットを探していました。怠け者です。

0
Paul