.NET TIPS PropertyGridコントロールに表示されるプロパティ名を変更するには?デジタルアドバンテージ 一色 政彦2005/04/22 |
|
|
「TIPS:PropertyGridコントロールを利用するには?」では、PropertyGridコントロールの基本的な使い方を紹介した。本稿ではその応用として、表示されるプロパティ名(以下、プロパティ表示名)を日本語などに変更する方法を紹介する。
本稿では再利用可能なソース・コード(クラス)を作成した。そのコードを含むソース・ファイルは、次のリンクからダウンロードできる。なお、名前空間は適切なものに書き換えてほしい(VB.NETの方のコードでは名前空間を指定していないので、名前空間を指定したい場合は独自に追加してほしい)。
このソース・ファイルに含まれるコードは読者がわざわざ再開発する必要はないが、まずは簡単にその仕組みについて触れておく。その後、このコードを利用してPropertyGridコントロールのプロパティ表示名を日本語に変更するための実装方法を解説する。
●PropertyGridコントロールのプロパティ表示名を変更するには?
プロパティ表示名は、そのプロパティに対応しているPropertyDescriptorクラスのオブジェクト(System.ComponentModel名前空間)のDisplayNameプロパティの値が使われている。このPropertyDescriptorオブジェクトは、プロパティの説明(=情報)を提供するためのもので(「TIPS:PropertyGridコントロールのプロパティ変更時に処理を行うには?」を参照)、そのDisplayNameプロパティからはプロパティ表示名を取得することができる。
それならば、DisplayNameプロパティに適切な表示名を外部から設定してやれば済むように思えるが、このDisplayNameプロパティは読み取り専用である。そのため、PropertyDescriptorクラスの派生クラスを作成してDisplayNameプロパティをオーバーライドし、そのプロパティ内で適切な表示名を(戻り値として)返すように実装する必要がある。そこで本稿では、PropertyDisplayPropertyDescriptorという派生クラスを作成した。
PropertyDescriptorクラスは8つの抽象メソッドと抽象プロパティを提供するので(例えばShouldSerializeValueメソッドやComponentTypeプロパティなど。詳しくは、MSDNの「PropertyDescriptor クラス」を参照されたい)、PropertyDescriptor派生クラスでは、これらすべてを実装する必要がある(なお、その実際の実装コードをすべて説明すると非常に長くなってしまうので、ここでは割愛する。詳しくは先に示したソース・コードの内容を参照してほしい)。
●プロパティ表示名の変更を有効にするには?
PropertyDescriptor派生クラスを作成したら、次は、PropertyGridコントロールのプロパティ表示で、それが用いられるようにしなければならない。つまり、PropertyGridコントロールのプロパティ表示で、PropertyDescriptorオブジェクトの代わりに、PropertyDisplayPropertyDescriptorオブジェクトが使われるようにするのだ。
これを実現するのが、TypeConverter属性(=TypeConverterAttributeクラス。System.ComponentModel名前空間)である。TypeConverter属性では、クラスに対する型コンバータを指定できる。型コンバータとは、その名のとおり、型の内容を変換するためのものだ(詳しくは、MSDN「型コンバータの実装」を参照)。つまりこの型コンバータの中で、PropertyDescriptorオブジェクトを、PropertyDisplayPropertyDescriptorオブジェクトへと置き換えるわけである。
TypeConverter属性では、そのパラメータにTypeConverterクラス(System.ComponentModel名前空間)の派生クラスの型を指定しなければならない(TypeConverterAttributeクラスとTypeConverterクラスは異なるので注意してほしい)。このTypeConverter派生クラスが、先ほど述べた型コンバータである。
本稿では、TypeConverter派生クラス(=型コンバータ)としてPropertyDisplayConverterクラスを実装した。このPropertyDisplayConverterクラスでは、もともと使われているPropertyDescriptorオブジェクトを、本稿で拡張したPropertyDisplayPropertyDescriptorオブジェクト(=PropertyDescriptor派生クラスのオブジェクト)に置き換える処理を記述している(この実装内容についても割愛する)。
以上の内容により、プロパティ表示名の変更を行いたいクラスに対してTypeConverter属性でPropertyDisplayConverterを指定すれば、実行時にはPropertyDisplayPropertyDescriptorオブジェクトが使われ、プロパティ表示名が実際に変更されるようになる。その具体的な属性の指定方法は次のとおりだ。
// C# |
' VB.NET |
以上の実装内容で、プロパティ表示名を変更できるようになったわけだ。
次にプロパティ表示名の指定であるが、これは、PropertyDisplayPropertyDescriptorクラス(=PropertyDescriptor派生クラス)のDisplayNameプロパティ内で実装できる。つまり、DisplayNameプロパティの中で、そのプロパティの名前を判別して、適切な表示名を(戻り値として)返却するように(ハード・コーディングで)実装する。
しかしこれでは、このDisplayNameプロパティの内部で、すべてのプロパティ表示名を管理しなければならなくなる(プロパティを新しく追加するたびに、その表示名をDisplayNameプロパティの中に追加しなければならない)。これではあまりにも効率が悪い。どうにかして、PropertyDisplayPropertyDescriptorクラスの外部からプロパティ表示名を簡単に設定できないだろうか?
●プロパティ表示名を外部から設定するには?
そこで本稿では、カスタム属性を実装することにより、その属性を使って外部からプロパティ表示名を設定できるようにした。
具体的には、PropertyDisplayName属性(=PropertyDisplayNameAttributeクラス)を新たに作成し、PropertyDisplayPropertyDescriptorクラスのDisplayNameプロパティの中で、PropertyDisplayName属性が指定されたプロパティに関しては、その値をプロパティ表示名として使うようにしている(このコード内容の詳細についても割愛する)。これにより、DisplayNameプロパティの中で、プロパティ表示名を管理する必要はなくなる。
このおかげで、次のコード例のように、プロパティに対してPropertyDisplayName属性を指定するだけで、そのプロパティの表示名を変更できるようになる。
// C# |
' VB.NET |
以上が冒頭で示したソース・コードの実装内容である。
●プロパティ表示名を変更してみる
それでは、本稿が提供するソース・コード(PropertyDisplayConverterクラスとPropertyDisplayName属性)を使って、実際にプロパティ表示名を変更してみよう。
ポイントは、PropertyGridコントロールの対象となるクラスに対してTypeConverter属性でPropertyDisplayConverterクラスの型を指定することと、そのクラスの中のプロパティに対してPropertyDisplayName属性で表示名を指定することである。
具体的には次のようなソース・コードとなる。なお、このソース・コードは、前掲の「TIPS:PropertyGridコントロールを利用するには?」で提供しているサンプル・プログラムをベースに、上記の(ポイントの)内容を追加したものだ。
|
|
アプリケーションの設定情報用のクラス(C#) | |
|
|
アプリケーションの設定情報用のクラス(VB.NET) | |
上記のコードは、単にTypeConverterとPropertyDisplayNameの属性指定を追加しただけである。
このサンプル・プログラムを実行すると、次のようにプロパティ表示名が日本語で表示される。
プロパティ表示名が日本語で表示されるサンプル・プログラム |
BackColorプロパティは「背景色」という日本語で表示され、WindowStateプロパティは「表示状態」という日本語で表示されている。 |
このように、本稿が提供するソース・コードを利用すれば、クラスとプロパティに属性を指定するだけで、容易にプロパティに対して日本語が表示できるようになる。
なお、これは単にPropertyGridコントロール上の表示名(=PropertyDescriptorクラスのDisplayNameプロパティが返す値)が変更されているだけで、実際のプロパティ名が変更されているわけではない。従って、そのほかの実装コードには影響しないはずである。
カテゴリ:Windowsフォーム 処理対象:PropertyGridコントロール 使用ライブラリ:PropertyGridクラス(System.Windows.Forms名前空間) 使用ライブラリ:PropertyDescriptorクラス(System.ComponentModel名前空間) 使用ライブラリ:TypeConverter属性(System.ComponentModel名前空間) 使用ライブラリ:TypeConverterクラス(System.ComponentModel名前空間) 関連TIPS:PropertyGridコントロールを利用するには? 関連TIPS:PropertyGridコントロールのプロパティ変更時に処理を行うには? |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|