Frameworkには、PropertyGridコントロールというコンポーネントが標準で用意されています。Studioのプロパティウィンドウと同等の機能を提供します。オブジェクトのプロパティをリスト表示し、その値をユーザーが変更できるようになっており、さらに、上部には並び方の指定等を行うツールバーが、下部には選択されているプロパティの説明の表示スペース(説明ペイン)が用意されています。PropertyGridコントロールは、ただオブジェクトを指定するだけで、そのオブジェクトのプロパティを自動的に取得し、リスト表示してくれます。PropertyGridコントロールでプロパティの値が変更されると、すぐにオブジェクトにその変更が反映されます。アプリケーションの設定をクラスで行っている場合、PropertyGridコントロールを使えば驚くほど簡単にアプリケーションの設定画面を作成することができるため、今後PropertyGridコントロールを使用したアプリケーションが増えることは間違いないでしょう。(少なくとも、この記事を読んでいただいた方はきっと使いたくなるでしょう。化」などで詳しく説明されています。この記事の内容がこれらの記事とかなりの部分でかぶっていることをご了承ください。使ってみようPropertyGridクラスは、System.Windows.Forms名前空間、System.Windows.Forms.dllアセンブリにあるため、特別なことをすることなく、普通のコントロールと同じようにPropertyGridコントロールを使用することができます。Studioでは、デフォルトで「ツールボックス」の「Windowsフォーム」タブ(あるいは「コンポーネント」タブ)にPropertyGridコントロールが用意されていないため、フォームデザイナを使ってPropertyGridコントロールを配置できません。(PropertyGridコントロールがあまり知られていないのはこのためでしょう。)「Windowsフォーム」タブにPropertyGridコントロールを追加するには、「ツールボックス」の「Windowsフォーム」タブを右クリックし、表示されるメニューから「アイテムの追加と削除」を選択します。Frameworkコンポーネント」タブ内のリストから、「PropertyGrid」という名前の項目を探し、左端のチェックボックスにチェックを入れ、「OK」をクリックしてください。これで「Windowsフォーム」タブに「PropertyGrid」が追加されたはずです。それでは早速PropertyGridコントロールを使ってみましょう。ここでは、フォーム"Form1"にPropertyGridコントロール"PropertyGrid1"を配置したとします。PropertyGridコントロールのすばらしさを実感していただくために、次のような一行をForm1のLoadイベントハンドラに記述してみてください。this;ビルドし実行すると、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コントロールに表示されてみましょう。次のようなクラスを作成します。}}TestClassオブジェクトをPropertyGrid.SelectedObjectプロパティに設定すると、PropertyGridコントロールにTestClassクラスのパブリックプロパティがリスト表示されるはずです(下図)。obj;何もしなくてもPropertyGridコントロールでは、プロパティの型に応じて、適切な値の編集方法が提供されます。bool(Boolean)型のBooleanValueプロパティは、TrueかFalseかを選択するためにコンボボックスが使用され、同様に、列挙型のEnumValueプロパティもコンボボックスが使用されます。それ以外では、Color型のプロパティではリストにより色の選択が、Font型のプロパティではフォント選択ダイアログを使用しての選択が、Image型のプロパティでは「ファイルを開く」ダイアログによる画像ファイルの選択と、画像の縮小表示ができるようになっています。プロパティの表示方法を変更するこのようにPropertyGridコントロールは実に簡単に使えますので、これだけの知識でもそれなりの事は行えますが、実際に使うとなると、更なる知識が必要となるでしょう。ここから以下は、特にプロパティの表示方法に関するテクニックを説明していきます。System.ComponentModelが宣言されているものとします。Studioの場合、プロパティがデフォルト値(規定値)でないときに、値が太字で表示されます。上記の"TestClass"の例では、すべての値が太字で表示されます。プロパティがデフォルト値でないときだけ値が太字で表示するには、DefaultValueAttributeを使用して、プロパティのデフォルト値を決めておきます。次の例では、IntegerValueプロパティのデフォルト値を0にしています。value;}}DefaultValueAttributeのコンストラクタには、Boolean、Byte、Char、Double、Int16Int32、Int64、Object、Single、String型の値を指定できますが、それ以外の型の場合はそのままではできません。一つの方法としては、TypeConverterによって指定した型に変換できる文字列をDefaultValueAttributeコンストラクタに指定する方法があります。20"といった文字列が使えます。補足:この方法は、掲示板でご指摘をいただきました。次の例では、ColorValueプロパティのデフォルト値をColor.Redにしています。}}もう一つの方法としては、"ShouldSerializeMyProperty"メソッドを使用する方法があります。クラスに"ShouldSerializeMyProperty"という名前でbool(Boolean)を返すメソッドを作り、デフォルト値ならFalse、そうでなければTrueを返すようにします。メソッド」等をご覧ください。)次の例ではこの方法でColorValueプロパティのデフォルト値をColor.Redにしています。System.Drawing.Color.Red;}クラスのデフォルトプロパティを指定するPropertyGridコントロールで一番初めに選択されるプロパティを指定するには、クラスにDefaultPropertyAttributeを適用します。次の例では、"TestClass"クラスのデフォルトプロパティを"StringValue"プロパティにしています。//(省略)}プロパティの説明を表示するPropertyGridコントロールの説明ペインに、選択されているプロパティの説明を表示するには、DescriptionAttributeを使用します。次の例では、StringValueプロパティの説明を設定しています。VB.NETJavaScriptを有効にしてくださいコードを隠すコードを選択<Description("ここにStringValueの説明を書きます。PropertyC#JavaScriptを有効にしてくださいコードを隠すコードを選択[Description("ここにStringValueの説明を書きます。value;}}プロパティの項目を指定するPropertyGridコントロールではプロパティを項目(カテゴリ)別に表示できます。項目別に表示したとき、プロパティはデフォルトで「その他」に分類されますが、CategoryAttributeにより、プロパティの項目を指定することができます。次の例では、ColorValueプロパティの項目を"表示"にしています。value;}}プロパティを表示しないPropertyGridコントロールに表示したくないプロパティには、Falseを指定したBrowsableAttributeを適用します。次の例では、BooleanValueプロパティをPropertyGridコントロールに表示しないようにしています。value;}}プロパティの値を編集されないようにするプロパティの値をユーザーが編集できないようにするには、Trueを指定したReadOnlyAttributeを使用します。次の例では、IntegerValueプロパティをPropertyGridコントロールでユーザーが編集できないようにしています。value;}}「ファイルを開く」ダイアログを表示してファイルを選択できるようにする右側にボタンを表示し、このボタンをクリックすることにより「ファイルを開く」ダイアログを表示して、プロパティの値を設定できるようにするには、FileNameEditorをエディタに指定したEditorAttributeを使用します。System.Designアセンブリを参照に追加する必要があります。次の例では、StringValueプロパティにボタンを表示し、「ファイルを開く」ダイアログにより、ファイルを選択できるようにしています。value;}}プロパティを展開できるようにする例えば次のようなSize型のプロパティは、PropertyGridコントロールでは展開してSizeクラスのHeightとWidthプロパティが表示できます(下図)。}}しかし次のような自作のクラスの場合は、展開ができず、値を変更することができません。}}このような自作のクラス型のプロパティでもPropertyGridコントロールで展開ができるようにするには、TypeConverterAttributeを"CustomClass"クラスに適用し、使用する型コンバータ(TypeConverter)としてExpandableObjectConverterを指定します。具体的には、次のようになります。//(省略)}これで"CustomClass"型のプロパティが展開できるようになりました。Size型やFont型のプロパティと違い、プロパティそのものの値を表示する部分には、クラス名が表示され、編集できません。ここに表示される文字列を制御し、さらに編集できるようにするには、ExpandableObjectConverterクラスの派生クラスを作成し、CanConvertTo、CanConvertFrom、ConvertTo、ConvertFromメソッドをそれぞれオーバーライドします。(型コンバータにより、オブジェクトを文字列に、また、文字列をオブジェクトに変換する方法を提供します。)次のような型コンバータクラスを使用することにより、CustomClassのNumberとMessageプロパティがコンマで区切られた文字列として表示されるようになります(編集もできるようになります)(下図)。}}使い方は前と同じです。化」では、さらに、「簡単なドロップダウンプロパティを提供する方法」、「プロパティのカスタムUIを提供する方法」などが紹介されています。「プロパティのデフォルト値を指定する」のVB.NETのコードで、「DefaultValue(0)」が抜けていたのを修正。DefaultValueでデフォルトのColorを指定する具体例を追加など。注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。Tipsをご利用いただく際は、注意事項をお守りください。共有するこの記事への評価この記事の評価を見る・評価するには、JavaScriptを有効にしてください。この記事へのコメントこの記事へのコメントの一覧を見るこの記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。設定JavaScriptを有効にしてください。