Winforms-設定の動的なロード/保存
質問
「設定ファイル」がありますカスタムメソッドなどの部分クラスを持つSettings.settingsと呼ばれるWinformsアプリケーションで。任意のキーに基づいて動的設定をロード/保存する方法はありますか?
たとえば、アプリケーションにいくつかのリストビューがあり、列の幅を保存/ロードしたい場合。各リストビューの各列の幅設定を作成する代わりに、幅を自動的にロード/保存する簡単な方法が欲しいです。
以下は、私が試した save メソッドの例です。
internal sealed partial class Settings
{
public void SetListViewColumnWidths(ListView listView)
{
String baseKey = listView.Name;
foreach (ColumnHeader h in listView.Columns)
{
String key = String.Format("{0}-{1}", baseKey, h.Index);
this[key] = h.Width;
}
}
}
そのコードを実行するとエラー"設定プロパティ 'TestsListView-0'が見つかりませんでした。" 不足しているものがありますか?
解決
列幅の設定をXml Serializableオブジェクトに保存します。つまり、 IXmlSerializable を実装してから作成するものSettings.settingsのそのタイプの単一の設定エントリ。
適切なオプションは、おそらくXml Serializable Dictionaryです。簡単な Google検索では、かなりの数の異なるブログ投稿が見つかりました。実装方法を説明します。
他の回答で述べたように、このオブジェクトがユーザー設定であることを確認する必要があります。設定インスタンスを初期化する必要がある場合もあります。つまり、XmlSerializableDictionary()インスタンスを作成し、設定がnullの場合、それを設定に割り当てます。設定サブシステムは、複雑な設定オブジェクトのデフォルトインスタンスを作成しません。
また、これらの設定をアセンブリバージョン間で保持する(つまり、アップグレード可能にする)場合は、アプリケーションの起動時に設定をアップグレードする必要があります。これについては、 Miha Markič 'で詳しく説明されています。 s ブログおよび Raghavendra Prabhuのブログ。
他のヒント
エラーだと思う
設定プロパティ 「キー」が見つかりませんでした。
発生するのは、「key」値が設定ファイルに存在しないためです(かなり自明です)。
私が知っている限り、プログラムで設定値を追加することはできません。ファイルに必要なすべての設定を追加することを検討する必要があるかもしれませんが、一度設定されると、指定した種類のコードを使用して変更を保存します。
変更を保存するには、それらが「アプリケーション」ではなく「ユーザー」設定であることを確認する必要があります。
設定ファイルは非常に単純なXMLであるため、XMLをファイルに直接書き込むことで問題を攻撃できる可能性がありますが、私は一度も実行したことがないため、動作するかどうかはわかりません。そのアプローチ。
http://msdn.microsoft.com/en-us/library /cftf714c.aspx は、最初のMSDNリンクです。
ユーザー設定でSettings.Save()または同様の操作を実行できますが、そのような設定はアプリディレクトリ内のxxx.exe.configファイルには期待どおりに保持されないことに注意してください。実際には、ユーザーフォルダーの奥深くに移動します(xxx.exe.configをドライブで検索して見つけます)。次回appディレクトリのxxx.exe.configを手動で変更すると、変更は不思議なことに適用されません(システムはまだユーザーディレクトリから保存されたものを使用しています)。