┏第32号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・PropertyGridコントロールの使い方 ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●PropertyGridコントロールの使い方 ★「PropertyGridコントロール」とは? .NET Frameworkには、PropertyGridコントロールというコンポーネン トが標準で用意されています。このPropertyGridコントロールは、 Microsoft Visual Studio .NETのプロパティウィンドウで使用されて いるコントロールです(全く同じものが使用されているのかは分かり ません)。つまり、オブジェクトのプロパティをリスト表示し、その 値をユーザーが変更できるようになっており、さらに、上部には並び 方の指定等を行うツールバーが、下部には選択されているプロパティ の説明の表示スペース(説明ペイン)が付いたコントロールです。 PropertyGridコントロールは、ただオブジェクトを指定するだけで、 そのオブジェクトのプロパティを自動的に取得し、リスト表示してく れます。さらに、PropertyGridコントロールでプロパティの値が変更 されると、すぐにオブジェクトにその変更が反映されます。例えば、 アプリケーションの設定をクラスで行っている場合、PropertyGridコ ントロールを使えば驚くほど簡単にアプリケーションの設定画面を作 成することができるため、今後PropertyGridコントロールを使用した アプリケーションが増えることは間違いないでしょう。(少なくとも、 この記事を読んでいただいた方はきっと使いたくなるでしょう。) 補足:PropertyGridコントロールの使い方に関しては、MSDNにある「. NET Framework の PropertyGrid コントロールの高度な活用」や「 Visual Studio .NET プロパティ ブラウザによるコンポーネントの本 格的な RAD 化」などで詳しく説明されています。この記事の内容がこ れらの記事とかなりの部分でかぶっていることをご了承ください。 [URL].NET Framework の PropertyGrid コントロールの高度な活用 http://www.microsoft.com/japan/msdn/net/general/usingpropgrid.asp [URL]Visual Studio .NET プロパティ ブラウザによるコンポーネント の本格的な RAD 化 http://www.microsoft.com/japan/msdn/net/general/vsnetpropbrow.asp ★とりあえず使ってみよう PropertyGridクラスは、System.Windows.Forms名前空間、System. Windows.Forms.dllアセンブリにあるため、特に特別なことをすること なく、普通のコントロールと同じようにPropertyGridコントロールを 使用することができます。ところがVisual Studio .NETでは、デフォ ルトで「ツールボックス」の「Windowsフォーム」タブ(あるいは「コン ポーネント」タブ)にPropertyGridコントロールが用意されていないた め、フォームデザイナでPropertyGridコントロールを配置できません。 (PropertyGridコントロールがあまり知られていないのはこのためで しょう。) 「Windowsフォーム」タブにPropertyGridコントロールを追加するには、 「ツールボックス」の「Windowsフォーム」タブを右クリックし、表示さ れるメニューから「アイテムの追加と削除」を選択します。表示される 「ツールボックスのカスタマイズ」ダイアログの「.NET Frameworkコ ンポーネント」タブ内のリストから、「PropertyGrid」という名前の 項目を探し、左端のチェックボックスにチェックを入れ、「OK」をク リックしてください。これで「Windowsフォーム」タブに「 PropertyGrid」が追加されたはずです。 それでは早速PropertyGridコントロールを使ってみましょう。ここで は、フォーム"Form1"にPropertyGridコントロール"PropertyGrid1"を 配置したとします。 まずはPropertyGridコントロールのすばらしさを実感していただくた めに、次のような一行をForm1のLoadイベントハンドラに記述してみて ください。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ PropertyGrid1.SelectedObject = Me ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ PropertyGrid1.SelectedObject = this; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ビルドし実行すると、PropertyGridコントロールにForm1のプロパティ がリスト表示されることが分かります。さらに面白いことに、 PropertyGridコントロールでプロパティの値を変更すると、その変更 がすぐにForm1に反映されます。例えば、"ControlBox"を"False"にす ると、コントロールボックスが消えますし、"BackColor"で背景色を変 更できます。 PropertyGrid.SelectedObjectプロパティを設定しただけで、これだけ のことができてしまいます。 ★PropertyGridコントロールの基本的なプロパティ PropertyGridコントロールで使用される基本的なプロパティ、イベン トについてごく簡単に説明しておきます。 PropertyGridコントロールのツールバーを表示しないようにするには、 ToolbarVisibleプロパティをFalseにします。LargeButtonsプロパティ をTrueにすることにより、ツールバーのボタンの大きさを倍(32X32) にすることができます(アイコンが荒くなり、見た目はよくありませ ん)。説明ペインを表示しないようにするには、HelpVisibleプロパテ ィをFalseにします。 プロパティの並べ方は、PropertySortプロパティで指定します。アル ファベット順(Alphabetical)、項目別(Categorized)、項目別でアルフ ァベット順(CategorizedAlphabetical)、並び替えをしない(NoSort)を 指定できます。 選択されている項目は、SelectedGridItemプロパティにより取得でき ます。また、選択されている項目が変更された時、 SelectedGridItemChangedイベントが発生します。プロパティの値が変 更された時には、PropertyValueChangedイベントが発生します。 ★自作したクラスに使ってみよう 次に、クラスを自作し、そのプロパティをPropertyGridコントロール に表示されてみましょう。 まずは、次のようなクラスを作成します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class TestClass Public Enum TestEnum One Two Tree End Enum Private _integerValue As Integer = 0 Private _stringValue As String = "こんにちは" Private _booleanValue As Boolean = False Private _enumValue As TestEnum = TestEnum.One Private _colorValue As System.Drawing.Color = _ System.Drawing.Color.Red Public Property IntegerValue() As Integer Get Return _integerValue End Get Set(ByVal Value As Integer) _integerValue = Value End Set End Property Public Property StringValue() As String Get Return _stringValue End Get Set(ByVal Value As String) _stringValue = Value End Set End Property Public Property BooleanValue() As Boolean Get Return _booleanValue End Get Set(ByVal Value As Boolean) _booleanValue = Value End Set End Property Public Property EnumValue() As TestEnum Get Return _enumValue End Get Set(ByVal Value As TestEnum) _enumValue = Value End Set End Property Public Property ColorValue() As System.Drawing.Color Get Return _colorValue End Get Set(ByVal Value As System.Drawing.Color) _colorValue = Value End Set End Property End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ public class TestClass { public enum TestEnum { One, Two, Tree } private int _integerValue = 0; private string _stringValue = "こんにちは"; private bool _booleanValue = false; private TestEnum _enumValue = TestEnum.One; private System.Drawing.Color _colorValue = System.Drawing.Color.Red; public int IntegerValue { get {return _integerValue;} set {_integerValue = value;} } public string StringValue { get {return _stringValue;} set {_stringValue = value;} } public bool BooleanValue { get {return _booleanValue;} set {_booleanValue = value;} } public TestEnum EnumValue { get {return _enumValue;} set {_enumValue = value;} } public System.Drawing.Color ColorValue { get {return _colorValue;} set {_colorValue = value;} } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ このTestClassオブジェクトを次のようにしてPropertyGrid. SelectedObjectプロパティに設定してみます。PropertyGridコントロー ルにTestClassのパブリックプロパティがリスト表示されるでしょう。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Dim cls As New TestClass PropertyGrid1.SelectedObject = cls ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ TestClass cls = new TestClass(); PropertyGrid1.SelectedObject = cls; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 何もしなくてもPropertyGridコントロールでは、プロパティの型に応 じて、適切な値の編集方法が提供されます。例えば、bool(Boolean)型 のBooleanValueプロパティは、TrueかFalseかを選択するためにコンボ ボックスが使用され、同様に、列挙型のEnumValueプロパティもコンボ ボックスが使用されます。 それ以外では、Color型のプロパティではリストにより色の選択が、 Font型のプロパティではフォント選択ダイアログを使用しての選択が、 Image型のプロパティでは「ファイルを開く」ダイアログによる画像フ ァイルの選択と、画像の縮小表示ができるようになっています。 さらに配列でも、適当なコレクションエディタを表示するボタンが 表示されます。 ★プロパティの表示方法を変更する このようにPropertyGridコントロールは実に簡単に使えますので、こ れだけの知識でもそれなりの事は行えますが、実際に使うとなると、 更なる知識が必要となるでしょう。 ここから以下は、特にプロパティの表示方法に関するテクニックを説 明していきます。これらのテクニックのほとんどが属性を使ったもの であり、System.ComponentModel名前空間にあるクラスを使用している ため、以下のサンプルでは、C#では using System.ComponentModel; VB.NETでは Imports System.ComponentModel が宣言されているものとします。 ★プロパティのデフォルト値を指定する VS.NETの場合、プロパティがデフォルト値(規定値)でないときに、 値が太字で表示されます。上記の"TestClass"の例では、すべての値が 太字で表示されます。プロパティがデフォルト値でないときだけ値が 太字で表示するには、DefaultValueAttributeを使用して、プロパティ のデフォルト値を決めておきます。 次の例では、IntegerValueプロパティのデフォルト値を0にしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property IntegerValue() As Integer Get Return _integerValue End Get Set(ByVal Value As Integer) _integerValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [DefaultValue(0)] public int IntegerValue { get {return _integerValue;} set {_integerValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ところで、Color型、Font型、Size型などのデフォルト値は上記の方法 では指定できません。これらのデフォルトを指定するには、 "ShouldSerializeMyProperty"メソッドを使用します。クラスに "ShouldSerializeMyProperty"という名前でbool(Boolean)を返すメソ ッドを作り、デフォルト値ならFalse、そうでなければTrueを返すよう にします。(詳しくはヘルプの「PropertyDescriptor. ShouldSerializeValue メソッド」等をご覧ください。) [URL]PropertyDescriptor.ShouldSerializeValue メソッド http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemcomponentmodelpropertydescriptorclassshouldserializevaluetopic.asp 次の例では、ColorValueプロパティのデフォルト値をColor.Redにして います。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Private _colorValue As System.Drawing.Color = _ System.Drawing.Color.Red Public Property ColorValue() As System.Drawing.Color Get Return _colorValue End Get Set(ByVal Value As System.Drawing.Color) _colorValue = Value End Set End Property Private Function ShouldSerializeColorValue() As Boolean Return Not ColorValue.Equals(System.Drawing.Color.Red) End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ private System.Drawing.Color _colorValue = System.Drawing.Color.Red; public System.Drawing.Color ColorValue { get {return _colorValue;} set {_colorValue = value;} } private bool ShouldSerializeColorValue() { return ColorValue != System.Drawing.Color.Red; } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★クラスのデフォルトプロパティを指定する PropertyGridコントロールで一番初めに選択されるプロパティを指定 するには、クラスにDefaultPropertyAttributeを追加します。 次の例では、"TestClass"クラスのデフォルトプロパティを "StringValue"プロパティにしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Class TestClass '(省略) End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [DefaultProperty("StringValue")] public class TestClass { //(省略) } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★プロパティの説明を表示する PropertyGridコントロールの説明ペインに、選択されているプロパテ ィの説明を表示するには、DescriptionAttributeを使用します。 次の例では、StringValueプロパティの説明を設定しています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property StringValue() As String Get Return _stringValue End Get Set(ByVal Value As String) _stringValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [Description("ここにStringValueの説明を書きます。")] public string StringValue { get {return _stringValue;} set {_stringValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★プロパティの項目を指定する PropertyGridコントロールではプロパティを項目(カテゴリ)別に表示 できます。項目別に表示したとき、プロパティはデフォルトで「その 他」に分類されますが、CategoryAttributeにより、プロパティの項目 を指定することができます。 次の例では、ColorValueプロパティの項目を"表示"にしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property ColorValue() As System.Drawing.Color Get Return _colorValue End Get Set(ByVal Value As System.Drawing.Color) _colorValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [Category("表示")] public System.Drawing.Color ColorValue { get {return _colorValue;} set {_colorValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★プロパティを表示しない PropertyGridコントロールに表示したくないプロパティには、Falseを 指定したBrowsableAttributeを追加します。 次の例では、BooleanValueプロパティをPropertyGridコントロールに 表示しないようにしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property BooleanValue() As Boolean Get Return _booleanValue End Get Set(ByVal Value As Boolean) _booleanValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [Browsable(false)] public bool BooleanValue { get {return _booleanValue;} set {_booleanValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★プロパティの値が編集できないようにする プロパティの値をユーザーが編集できないようにするには、Trueを指 定したReadOnlyAttributeを使用します。 次の例では、IntegerValueプロパティをPropertyGridコントロールで ユーザーが編集できないようにしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property IntegerValue() As Integer Get Return _integerValue End Get Set(ByVal Value As Integer) _integerValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [ReadOnly(true)] public int IntegerValue { get {return _integerValue;} set {_integerValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★「ファイルを開く」ダイアログを表示してファイルを選択できるよ うにする 右側にボタンを表示し、このボタンをクリックすることにより「ファ イルを開く」ダイアログを表示して、プロパティの値を設定できるよ うにするには、FileNameEditorをエディタに指定した EditorAttributeを使用します。なお、System.Designアセンブリを参 照に追加する必要があります。 次の例では、StringValueプロパティにボタンを表示し、「ファイルを 開く」ダイアログにより、ファイルを選択できるようにしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Property StringValue() As String Get Return _stringValue End Get Set(ByVal Value As String) _stringValue = Value End Set End Property ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [Editor(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))] public string StringValue { get {return _stringValue;} set {_stringValue = value;} } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★プロパティを展開できるようにする 例えば次のようなSize型のプロパティは、PropertyGridコントロール では展開してSizeクラスのHeightとWidthプロパティが表示できます。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class TestClass Private _size As New Size(10, 10) Public Property Size() As Size Get Return _size End Get Set(ByVal Value As Size) _size = value End Set End Property End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ public class TestClass { private Size _size = new Size(10, 10); public Size Size { get {return _size;} set {_size = value;} } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ しかし次のような自作のクラスの場合は、展開ができず、値を変更す ることができません。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class CustomClass Private _number As Integer = 0 Private _message As String = "hello" Public Property Number() As Integer Get Return _number End Get Set(ByVal Value As Integer) _number = Value End Set End Property Public Property Message() As String Get Return _message End Get Set(ByVal Value As String) _message = Value End Set End Property End Class Public Class TestClass Private _custom As New CustomClass Public Property Custom() As CustomClass Get Return _custom End Get Set(ByVal Value As CustomClass) _custom = Value End Set End Property End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ public class CustomClass { private int _number = 0; private string _message = "hello"; public int Number { get {return _number;} set {_number = value;} } public string Message { get {return _message;} set {_message = value;} } } public class TestClass { private CustomClass _custom = new CustomClass(); public CustomClass Custom { get {return _custom;} set {_custom = value;} } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ このような自作のクラス型のプロパティでもPropertyGridコントロー ルで展開ができるようにするには、TypeConverterAttributeを "CustomClass"クラスに追加し、使用する型コンバータ( TypeConverter)としてExpandableObjectConverterクラスを指定しま す。具体的には、次のようになります。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Class CustomClass '(省略) End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [TypeConverter(typeof(ExpandableObjectConverter))] public class CustomClass { //(省略) } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ これで"CustomClass"型のプロパティが展開できるようになりました。 しかし、Size型やFont型のプロパティと違い、プロパティそのものの 値を表示する部分には、クラス名が表示され、編集できません。ここ に表示される文字列を制御し、さらに編集できるようにするには、 ExpandableObjectConverterクラスの派生クラスを作成し、 CanConvertTo、CanConvertFrom、ConvertTo、ConvertFromメソッドを それぞれオーバーライドします。(型コンバータにより、オブジェク トを文字列に、また、文字列をオブジェクトに変換する方法を提供し ます。) 次のような型コンバータクラスを使用することにより、CustomClassの NumberとMessageプロパティがコンマで区切られた文字列として表示さ れるようになります(編集もできるようになります)。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class CustomClassConverter Inherits ExpandableObjectConverter 'コンバータがオブジェクトを指定した型に変換できるか '(変換できる時はTrueを返す) 'ここでは、CustomClass型のオブジェクトには変換可能とする Public Overloads Overrides Function CanConvertTo( _ ByVal context As ITypeDescriptorContext, _ ByVal destinationType As Type) As Boolean If destinationType Is GetType(CustomClass) Then Return True End If Return MyBase.CanConvertTo(context, destinationType) End Function '指定した値オブジェクトを、指定した型に変換する 'CustomClass型のオブジェクトをString型に変換する方法を提供する Public Overloads Overrides Function ConvertTo( _ ByVal context As ITypeDescriptorContext, _ ByVal culture As System.Globalization.CultureInfo, _ ByVal value As Object, _ ByVal destinationType As Type) As Object If destinationType Is GetType(String) And TypeOf value Is CustomClass Then Dim cc As CustomClass = CType(value, CustomClass) Return cc.Number.ToString() + "," + cc.Message End If Return MyBase.ConvertTo(context, culture, value, destinationType) End Function 'コンバータが特定の型のオブジェクトをコンバータの型に変換できるか '(変換できる時はTrueを返す) 'ここでは、String型のオブジェクトなら変換可能とする Public Overloads Overrides Function CanConvertFrom( _ ByVal context As ITypeDescriptorContext, _ ByVal sourceType As Type) As Boolean If sourceType Is GetType(String) Then Return True End If Return MyBase.CanConvertFrom(context, sourceType) End Function '指定した値をコンバータの型に変換する 'String型のオブジェクトをCustomClass型に変換する方法を提供する Public Overloads Overrides Function ConvertFrom( _ ByVal context As ITypeDescriptorContext, _ ByVal culture As System.Globalization.CultureInfo, _ ByVal value As Object) As Object If TypeOf value Is String Then Dim ss As String() = value.ToString().Split(New Char() {","c}, 2) Dim cc As New CustomClass cc.Number = Integer.Parse(ss(0)) cc.Message = ss(1) Return cc End If Return MyBase.ConvertFrom(context, culture, value) End Function End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ public class CustomClassConverter : ExpandableObjectConverter { //コンバータがオブジェクトを指定した型に変換できるか //(変換できる時はTrueを返す) //ここでは、CustomClass型のオブジェクトには変換可能とする public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(CustomClass)) return true; return base.CanConvertTo(context, destinationType); } //指定した値オブジェクトを、指定した型に変換する //CustomClass型のオブジェクトをString型に変換する方法を提供する public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string) && value is CustomClass) { CustomClass cc = (CustomClass) value; return cc.Number.ToString() + "," + cc.Message; } return base.ConvertTo(context, culture, value, destinationType); } //コンバータが特定の型のオブジェクトをコンバータの型に変換できるか //(変換できる時はTrueを返す) //ここでは、String型のオブジェクトなら変換可能とする public override bool CanConvertFrom( ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) return true; return base.CanConvertFrom (context, sourceType); } //指定した値をコンバータの型に変換する //String型のオブジェクトをCustomClass型に変換する方法を提供する public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { string[] ss = value.ToString().Split(new char[] {','}, 2); CustomClass cc = new CustomClass(); cc.Number = int.Parse(ss[0]); cc.Message = ss[1]; return cc; } return base.ConvertFrom(context, culture, value); } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 使い方は前と同じです。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Class CustomClass '(省略) End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [TypeConverter(typeof(CustomClassConverter))] public class CustomClass { //(省略) } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★もっと勉強したい方は... MSDNにある「.NET Framework の PropertyGrid コントロールの高度な 活用」及び「Visual Studio .NET プロパティ ブラウザによるコンポー ネントの本格的な RAD 化」では、さらに、「簡単なドロップダウンプ ロパティを提供する方法」、「プロパティのカスタムUIを提供する方 法」などが紹介されています。 参考: [URL].NET Framework の PropertyGrid コントロールの高度な活用 http://www.microsoft.com/japan/msdn/net/general/usingpropgrid.asp [URL]Visual Studio .NET プロパティ ブラウザによるコンポーネント の本格的な RAD 化 http://www.microsoft.com/japan/msdn/net/general/vsnetpropbrow.asp =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2003-Oct 2004)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2004 DOBON! All rights reserved. ===============================