【コピペで使える】App.config にコントロールの値を保存/復元するクラスを作ってみました。

当ページのリンクには広告が含まれています。

画面を伴うプログラムを自作していて、画面から入力した値を保存しておき、次に起動したときに復元させたい時があります。

そのようなときに使える方法として、アプリケーション構成ファイル(App.config) がありますが、値を保存/復元したいコントロール1つ1つに対して、App.configへの保存/読み出しコードを記述しなければならず、それなりに面倒です。

そこで、プログラム起動時にコントロールのリストを定義しておき、一括して保存/復元できる便利クラスを作ってみましたので、紹介したいと思います。

目次

概要

今回の自作クラス(AppSettings)は、内部で ConfigurationManager を利用しており、インスタンス生成時(new AppSettingsのとき)にApp.config から値を読み込み、コントロールに値を復元します。

また、AppSettingsの Saveメソッドを呼んだタイミングで、コントロールの値をApp.config に保存します。

AppSettingの構成図

ConfigurationManagerを使ったApp.configへの保存/復元方法については、「【すぐに使える】C#で app.configに設定値を保存・取得する(実用サンプル付き)」の記事で詳しく紹介していますので、興味のある方はご一読ください。

仕組み

インスタンス生成のタイミングで読み込んだApp.Configの値は、辞書(Dictionary)としてクラス内部に保持しています。

また、Saveメソッドにより辞書の内容をApp.config に保存しています。

引数にコントロール配列を渡した場合は、そのままクラス内部に保持すると同時に、コントロール名(XAMLに記述した x:Name の値)と辞書と突き合わせ、値を復元しています。

Saveメソッドが呼ばれると、クラス内部に保持されたコントロール配列からコントロールごとの値を取り出し、いったん辞書に反映させた後で、辞書をまるごとApp.Configに保存しています。

クラス内部の辞書の持ち方の説明図

以上の説明から分かるように、インスタンス生成時に辞書が作成され、Saveメソッド呼び出し時にコントロールの値で辞書が上書かれるため、途中で辞書の内容を変更しても、App.Configには反映されないのでご注意ください。

保存/復元可能なコントロールの値について

コントロールが持つ全ての値を保存/復元できる訳ではありません。

現時点では、Textプロパティと、IsCheckedプロパティの値のみ保存/復元が可能です。

例えば、TextBox、TextBlock、ComboBox、CheckBox などが該当します。

これ以外のコントロール、例えばLabelやDataGrid、ListBox、DatePickerなどについても対応させたい場合は、適宜必要に応じてコードの追加をしてください。

具体的は方法は、ソースコード紹介の後で記載しています。

ユーザーコントロールの値を保存/復元するには

自作のユーザーコントロールが持つ値を保存/復元したい場合は、Textプロパティを利用する方法がおすすめです。

Textプロパティが参照された時は、ユーザーコントロール内に存在する子のコントロールの値を、カンマ又はタブコードなどで区切り、1つの文字列として返します。

Textプロパティに代入された時は、その値をSplit等で分割し、子のコントロールのプロパティに代入します。

ユーザーコントロールにおけるTextプロパティの実装イメージ図

任意のキーによる値の保存/復元

クラス内部に保持した辞書に任意のキーで値を登録すると、それも合わせて自動で保存/復元します。

従って、コントロール以外の値(ただしテキストのみ)を管理することも可能です。

クラス内部の辞書にアクセスするには、通常の辞書と同様にインデクサを使うことが出来ます。

クラス内部の辞書への登録、参照のイメージ図

使い方

使い方は簡単で、値の保存/復元が必要なコントロールの配列を作成し、それを引数にしてAppSettingsのインスタンスを new で生成します。

これだけでコントロールのText又はIsCheckedプロパティの値が復元されます。

また、画面操作で変更されたコントロールの値は、保存したいタイミングでSave メソッドを呼び出すだけで完了します。

AppSettings の利用フロー図

下記はそのサンプルコードです。個人的な命名規則によりコントロール名の先頭は ux で統一していますが、必ずしも ux から始める必要はありません。

画面起動時に値を復元、終了時に値を保存するには

多くのケースでは、画面起動時にコントロールの値を復元し、画面終了時にコントロールの値を保存したいでしょう。

その場合、クラス変数として _settings を用意しておき、Loadedイベントハンドラ内でインスタンスを生成、_settings に格納しておきます。

そして、Closedイベントハンドラ内 にSaveメソッドを記述しておけば、画面終了時にコントロールの値が保存できます。

Windowにおける修正箇所のイメージ図

具体的には以下の様になります。

任意の値を保存、復元するには

任意の値をApp.configに保存したり、復元(取得)するには、クラス内部の辞書にアクセスする必要がありますが、以下の通りインデクサが利用可能です。

インスタンス変数[“任意のキー名”]

例えば、 以下の様に記述すると、”Age” というキーで “19”という文字列が登録されます。

辞書にキーがなければ新しく作られ、あれば追加されます。

また、削除するための Remove メソッドも用意しています。

ConfigurationManager を使った App.config は文字列しか保存できませんので、取得する際に必要に応じて型変換を行います。

AppSettingsクラスのソースコード

以下が今回紹介したクラスのソースコードです。

Textプロパティを持つコントロールとチェックボックスに対応していますので、それで事足りる場合はそのままコピペしてお使いいただけます。

新しいコントロールに対応させるには

新しいコントロールに対応させるというより、新しいプロパティに対応させるといった方が適切かもしれません。

まず、コンストラクタとSaveメソッド内に、対応させたいプロパティ名を記述します。

次に、RestorePropertyメソッド内に、プロパティ毎の型変換の処理を追加します。

ここでは、コントロールがCheckBoxの場合、bool に変換していますが、これはIsCheckedのプロパティが bool 型だからです。

CheckBoxに対して複数のプロパティ(例えば IsChecked、Content)を保存したい場合、今のままでは全てbool型に変換されてしまうので、プロパティ名で分岐(例えば IsChecked なら bool 、Content なら文字列)するなどの対応が必要です。

もしRadioButton に対応させたいなら、if 文にCheckBoxとRadioButtonの2つを記述するか、あるいは コントロールを見るのではなく、プロパティ名を見て型変換を使うなどの工夫が必要です。

この辺は、ご自身の用途や好みで修正してお使いください。

新しいコントロールに対応させる箇所のイメージ図

まとめ

今回は、コントロールの値(=プロパティの値)をApp.configに保存/復元する際に便利な自作クラス「AppSettings」について、その仕組みと使い方の説明、ソースコード一式の紹介を行いました。

ConfigurationManager の機能を呼び出すだけの自作クラスではありますが、間に辞書を挟むことによって、コントロールの値の保存/復元がかなり便利になるかと思います。

また、任意の値についても App.config へ保存/復元が可能なので、変数の値をファイルで管理したい場合にも活用できます。

コントロールの値や変数の値をファイルに保存して、プログラム起動時に復元したい場合は、是非この記事をお役立てください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次