.NET ROOM.NET ROOMトップへCOMRADE総合トップへ
「3:デザイン時に自作コントロールの設定を変更する方法」へ



3:デザイン時に自作コントロールの設定を変更する方法

 ・はじめに
 ・プロパティウィンドウでの操作
 ・プロパティへの文字列の代入
 ・ネストしたプロパティの展開
 ・独自ドロップダウンUIでのプロパティ操作
 ・ダイアログでのプロパティ操作
 ・カスタムエディタ(デザイナ)の表示
 ・デザイン時のコードを別アセンブリにする
 ・最後に
 ・アクセス修飾子の省略

 ◆付録 (本稿で取り上げたソースコードおよびサンプルプログラム)
   \MyPoint1
     「プロパティへの文字列の代入」サンプル
   \MyPoint2
     「ネストしたプロパティの展開」サンプル
   \MyPoint3
     「独自ドロップダウンUIでのプロパティ操作」サンプル
   \MyPoint4
     「ダイアログでのプロパティ操作」サンプル
   \MyPoint5
     「カスタムエディタ(デザイナ)の表示」サンプル
   \Reflection
     「デザイン時のコードを別アセンブリにする」サンプル

はじめに

 今回は、自作のコントロールをVisualStudio.NET(以下VS.NET)で使用する場合に役立つ方法を説明します。

 コントロールを利用するときは、必ず設定を変更し、自分の使用目的に合うようにします。
その際、コードでの設定変更以外に、VS.NETでのデザイン時にも各種の設定値を変更できるように
なっていれば格段に便利なコントロールとなります。

 また、コード上での値の設定は、VS.NET上のデザイン画面に基本的には反映されていないため、
プログラムを実際に実行してみなければ設定後の動作がわからないというデメリットもあります。

 デザイン時にプロパティを設定する方法として、主に以下の3つがあります。


@VS.NETのプロパティウィンドウを使用する

AVS.NETから、独自のエディタ(デザイナ)を起動して値を設定する

BVS.NETのデザイン画面でマウスを使用して直接値を変更できるようにする



 Bの方法は、実際にはAのデザイナを実装/使用することでより細かい設定が可能です。
詳細は後述しますが、Aのデザイナを実装する場合は、コントロールを配置するコンテナとして
通常のフォームを使用するため、通常のフォームのプログラミングで済みます。
これに対して、Bの方法をとる場合、VS.NETをコンテナとするため、
若干複雑なプログラミングを行なわなければなりません。
そのため、あえてBは避け、ここでは@とAの実装方法に関して説明してゆくことにします。



プロパティウィンドウでの操作

 まずは、プロパティウィンドウでの操作方法に関して見てみましょう。

 例として、標準Labelコントロールのプロパティを取り上げます。
フォームのデザイン画面で目的のコントロールを選択して、右クリックすると表示される
コンテキストメニューから[プロパティ]を選択すると、プロパティウィンドウにそのコントロールの
プロパティが表示されるようになっています(図1)。

図1:プロパティウィンドウの表示



 ここにはプロパティに関するさまざまな情報が表示されるほかに、
それぞれのプロパティを簡単に設定するための工夫がされています。
プロパティの設定には大きく分けて、以下のような特徴があります。


特徴1: 文字列で値を代入できるもの
該当するプロパティ例:Text、Size、Fontなど

特徴2: プロパティの横に、十字のアイコンが表示され、
ネストされたオブジェクトを展開できるもの
該当するプロパティ例:Location、Size、Fontなど(図2

特徴3: 独自のUIで値を変更できるもの
該当するプロパティ例:BackColor、Dockなど(図3

特徴4: ダイアログが表示され、値をダイアログ上で変更できるもの
該当するプロパティ例:Fontなど(図4


図2:ネストされたプロパティの展開(Fontプロパティ)



図3:独自UIでのプロパティ操作(Dockプロパティ)




図4:ダイアログでのプロパティ操作(Fontダイアログ)



  以降で、上記のそれぞれの特徴に関して、5つのサンプルプログラムを利用して
実装方法も含めて説明してゆきます。


ページトップへ


プロパティへの文字列の代入

 実は標準コントロールにあるほとんどのプロパティ、特にプロパティウィンドウに表示されるプロパティは、
文字列で値を設定することが可能です。
では、FontプロパティやSizeプロパティなど、String型ではないプロパティの値を文字列で
表わすにはどうすればいいのでしょうか?

 .NET Frameworkでは型変換を使用します。
型変換にはその名もずばり、TypeConverterクラスを使用します。

  以下に独自のクラスに対するTypeConverterを実装する方法に関して説明してゆきます。

 手順は以下の通りです。


手順1:TypeConverterから派生したクラスを作成

手順2:CanConvertFromメソッドをオーバーライド

手順3:ConvertFromメソッドをオーバーライド

手順4:CanConvertToメソッドをオーバーライド

手順5:ConvertToメソッドをオーバーライド

手順6:IsValidメソッドをオーバーライド



 ただし、手順4のCanConvertToメソッドは、String型への変換に関してはデフォルトでTrueを返すので、
ここではオーバーライドする必要はありません。
逆に文字列への変更を不可能にするため、CanConvertToメソッドを、

   public override bool CanConvertTo(
    ITypeDescriptorContext context, Type dstType) {
    if (dstType == typeof(string))
     return false;
   return base.CanConvertTo(context, dstType);
   }

のようにオーバーライドしても無視されてしまいました。
これは、.NET Frameworkのすべての型がObject型から派生しており、
必ずToString( )メソッドを実装するからだと推察されます。
もっとも、文字列への変換を禁止する必要は、まず“ない”といえるため、このような実装になっているのでしょう。

 IsValidメソッドのオーバーライドは、値の妥当性を細かく検証する必要がある場合などにのみ必要です。
通常の無効な入力に関しては、このオーバーライドを実装しなくても、ConvertFrom内で値を
変換できなかった場合にExceptionが発生し、不正な値を設定することはできません。

 最後に、作成したTypeConverterを、TypeConverterAttributeでクラスに関連付けます。

 なお、TypeConverterAttributeは、「AttributeTargets.All」であるため、
プロパティやフィールドにも関連付けることができます。
そのため、特定のプロパティやフィールドの型変換の挙動のみを変更することも可能です。

 ソースコードの詳細はサンプルMyPoint1を参照してください。


.NET Roomトップへ | ページトップへ | 次へ