3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(VB.Net)自作コントロールにおいて、不要なプロパティをデザイナANDインテリセンスで隠したい時

たとえば.Net標準のSystem.Windows.Forms.Buttonを継承した拡張ボタンコントロールを作ります。

その自作ボタンコントロールにSystem.Windows.Forms.Buttonのすべてのプロパティを実装しているわけではない場合、そのプロパティをなるべく開発者に使わせたくないために、未実装(というか意味がない)プロパティをVistual Studioのデザイナと、インテリセンス上では非表示することができるみたいです。

それのメモです。

■デザイナ上での非表示

まず、実際のソースを見てみましょう。(あらかじめ「System.Design.dll」への[参照の追加]が必要)

< Designer(GetType(OriginalButton.OriginalDesigner))> _

Public Class OriginalButton

Inherits System.Windows.Forms.Button

'''

''' デザイナ上の表示をカスタマイズするインナークラス

'''

'''

'''

Friend Class OriginalDesigner

Inherits System.Windows.Forms.Design.ControlDesigner

'''

''' 下記で指定してあるプロパティはデザイナでは非表示とする。

'''

'''

'''

Protected Overrides Sub PostFilterProperties(ByVal Properties As IDictionary)

Properties.Remove("Image")

End Sub

End Class

''実装部分

End Class

まず、自作コントロールクラスの属性として、

Designer(GetType(OriginalButton.OriginalDesigner))

を宣言します。

おそらくこのクラスのデザイナの設定は OriginalButton.OriginalDesigner クラスを使ってねということでしょう。

次に、OriginalButton.OriginalDesignerクラスを実装します。OriginalButtonの中に作り、インナークラスとします。

OriginalButtonクラスはSystem.Windows.Forms.Design.ControlDesignerを継承します。

そして、PostFilterPropertiesメソッドをオーバーライドし、

Properties.Remove("隠したいプロパティ名")

で指定したプロパティをデザイナ上から非表示にできます。

参考:@IT 第2回 継承と属性プログラミングで実現するRAD開発 「■クラス属性の指定による[プロパティ]ウィンドウ上への非表示化」の項目にあります。C#のサンプルもあります。

■インテリセンス上での非表示

おなじく、またコードを見てみましょう。

Public Class OriginalButton

Inherits System.Windows.Forms.Button

_

Public Shadows Property BackgroundImage() As Image

Get

Return MyBase.BackgroundImage

End Get

Set(ByVal Value As Image)

MyBase.BackgroundImage = Value

End Set

End Property

  ''実装部分

End Class

まず、非表示にしたい親クラスのプロパティをオーバーライドします。(親クラスのプロパティにOverridableがないときはShadowsを使っちゃいましょう)

そして、セッター、ゲッターは親クラスのプロパティをそのまま投げる形にします。

肝心なのはオーバーライドメソッドに

の属性をつけることです。

これでインテリセンス上にも出てきません。

しかし、出てこないと言って使えないわけではない(テキストエディタ見たく手で打てばいいだけ)のでその点は要注意です。

オブジェクト指向的にも継承元のメンバを使えないようにするということ自体、おかしなことかもしれません。

まさに、実装とアーキテクチャントのずれの部分ですね。

参考:・MS:~ 10 行でズバリ!! - 番外編 ~ 自分流のコントールを作っちゃおう ~ 下のほうの「プロパティを非表示にするには」に記述。

特定のプロパティやメソッドをインテリセンス上で非表示にする. C#での書き方が載ってます。