.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#
[TypeConverter(typeof(PropertyDisplayConverter))]
public class AppSettings {
  // PropertyGridコントロールでプロパティを変更するクラス
}
' VB.NET
<TypeConverter(GetType(PropertyDisplayConverter))> _
Public Class AppSettingsPublic
  ' PropertyGridコントロールでプロパティを変更するクラス
End Class

 以上の実装内容で、プロパティ表示名を変更できるようになったわけだ。

 次にプロパティ表示名の指定であるが、これは、PropertyDisplayPropertyDescriptorクラス(=PropertyDescriptor派生クラス)のDisplayNameプロパティ内で実装できる。つまり、DisplayNameプロパティの中で、そのプロパティの名前を判別して、適切な表示名を(戻り値として)返却するように(ハード・コーディングで)実装する。

 しかしこれでは、このDisplayNameプロパティの内部で、すべてのプロパティ表示名を管理しなければならなくなる(プロパティを新しく追加するたびに、その表示名をDisplayNameプロパティの中に追加しなければならない)。これではあまりにも効率が悪い。どうにかして、PropertyDisplayPropertyDescriptorクラスの外部からプロパティ表示名を簡単に設定できないだろうか?

●プロパティ表示名を外部から設定するには?

 そこで本稿では、カスタム属性を実装することにより、その属性を使って外部からプロパティ表示名を設定できるようにした。

 具体的には、PropertyDisplayName属性(=PropertyDisplayNameAttributeクラス)を新たに作成し、PropertyDisplayPropertyDescriptorクラスのDisplayNameプロパティの中で、PropertyDisplayName属性が指定されたプロパティに関しては、その値をプロパティ表示名として使うようにしている(このコード内容の詳細についても割愛する)。これにより、DisplayNameプロパティの中で、プロパティ表示名を管理する必要はなくなる。

 このおかげで、次のコード例のように、プロパティに対してPropertyDisplayName属性を指定するだけで、そのプロパティの表示名を変更できるようになる。

// C#
[PropertyDisplayName("背景色")]
public Color BackColor {
  // getとsetの実装
}
' VB.NET
<PropertyDisplayName("背景色")> _
Public Property BackColor() As Color
  ' GetとSetの実装
End Property

 以上が冒頭で示したソース・コードの実装内容である。

●プロパティ表示名を変更してみる

 それでは、本稿が提供するソース・コード(PropertyDisplayConverterクラスとPropertyDisplayName属性)を使って、実際にプロパティ表示名を変更してみよう。

 ポイントは、PropertyGridコントロールの対象となるクラスに対してTypeConverter属性でPropertyDisplayConverterクラスの型を指定することと、そのクラスの中のプロパティに対してPropertyDisplayName属性で表示名を指定することである。

 具体的には次のようなソース・コードとなる。なお、このソース・コードは、前掲の「TIPS:PropertyGridコントロールを利用するには?」で提供しているサンプル・プログラムをベースに、上記の(ポイントの)内容を追加したものだ。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace WindowsApplication1
{
  [TypeConverter(typeof(PropertyDisplayConverter))]
  public class AppSettings
  {
    // プロパティの値を格納する変数
    private FormWindowState myWindowState;
    private Color myBackColor;

    // コンストラクタでプロパティの値を初期化
    public AppSettings()
    {
      myWindowState = FormWindowState.Normal;
      myBackColor = SystemColors.Window;
    }

    // ウィンドウの表示状態を設定するプロパティ

    [PropertyDisplayName("表示状態")]
    public FormWindowState WindowState
    {
      get { return myWindowState; }
      set { myWindowState = value; }
    }

    //  ウィンドウの背景色を設定するプロパティ
    [PropertyDisplayName("背景色")]
    public Color BackColor
    {
      get { return myBackColor; }
      set { myBackColor = value; }
    }
  }
}
アプリケーションの設定情報用のクラス(C#)
 
Imports System.ComponentModel

<TypeConverter(GetType(PropertyDisplayConverter))> _
Public Class AppSettings

  ' プロパティの値を格納する変数
  Private myWindowState As FormWindowState
  Private myBackColor As Color

  ' コンストラクタでプロパティの値を初期化
  Public Sub New()
    myWindowState = FormWindowState.Normal
    myBackColor = SystemColors.Window
  End Sub

  ' ウィンドウの表示状態を設定するプロパティ
  <PropertyDisplayName("表示状態")> _
  Public Property WindowState() As FormWindowState
    Get
      Return myWindowState
    End Get
    Set(ByVal Value As FormWindowState)
      myWindowState = value
    End Set
  End Property

  ' ウィンドウの背景色を設定するプロパティ
  <PropertyDisplayName("背景色")> _
  Public Property BackColor() As Color
    Get
      Return myBackColor
    End Get
    Set(ByVal Value As Color)
      myBackColor = value
    End Set
  End Property
End Class
アプリケーションの設定情報用のクラス(VB.NET)

 上記のコードは、単にTypeConverterとPropertyDisplayNameの属性指定を追加しただけである。

 このサンプル・プログラムを実行すると、次のようにプロパティ表示名が日本語で表示される。

プロパティ表示名が日本語で表示されるサンプル・プログラム
BackColorプロパティは「背景色」という日本語で表示され、WindowStateプロパティは「表示状態」という日本語で表示されている。

 このように、本稿が提供するソース・コードを利用すれば、クラスとプロパティに属性を指定するだけで、容易にプロパティに対して日本語が表示できるようになる。

 なお、これは単にPropertyGridコントロール上の表示名(=PropertyDescriptorクラスのDisplayNameプロパティが返す値)が変更されているだけで、実際のプロパティ名が変更されているわけではない。従って、そのほかの実装コードには影響しないはずである。End of Article

カテゴリ:Windowsフォーム 処理対象:PropertyGridコントロール
使用ライブラリ:PropertyGridクラス(System.Windows.Forms名前空間)
使用ライブラリ:PropertyDescriptorクラス(System.ComponentModel名前空間)
使用ライブラリ:TypeConverter属性(System.ComponentModel名前空間)
使用ライブラリ:TypeConverterクラス(System.ComponentModel名前空間)
関連TIPS:PropertyGridコントロールを利用するには?
関連TIPS:PropertyGridコントロールのプロパティ変更時に処理を行うには?
 
この記事と関連性の高い別の.NET TIPS
PropertyGridコントロールを利用するには?
PropertyGridコントロールのプロパティ変更時に処理を行うには?
PropertyGridコントロールの表示内容をカスタマイズするには?
コントロールのクラス名からコントロール・オブジェクトを作成するには?
PropertyGridコントロールの外観をカスタマイズするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH