人気ブログランキング | 話題のタグを見る
(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

''' <summary>
''' デザイナ上の表示をカスタマイズするインナークラス
''' </summary>
''' <remarks>
''' </remarks>
Friend Class OriginalDesigner
Inherits System.Windows.Forms.Design.ControlDesigner
''' <summary>
''' 下記で指定してあるプロパティはデザイナでは非表示とする。
''' </summary>
''' <param name="Properties"></param>
''' <remarks></remarks>
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
<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
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を使っちゃいましょう)
そして、セッター、ゲッターは親クラスのプロパティをそのまま投げる形にします。
肝心なのはオーバーライドメソッドに
<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)>
の属性をつけることです。

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


しかし、出てこないと言って使えないわけではない(テキストエディタ見たく手で打てばいいだけ)のでその点は要注意です。
オブジェクト指向的にも継承元のメンバを使えないようにするということ自体、おかしなことかもしれません。
まさに、実装とアーキテクチャントのずれの部分ですね。


参考:・MS:~ 10 行でズバリ!! - 番外編 ~ 自分流のコントールを作っちゃおう ~ 下のほうの「プロパティを非表示にするには」に記述。
特定のプロパティやメソッドをインテリセンス上で非表示にする. C#での書き方が載ってます。
by jehoshaphat | 2008-06-19 15:36 | .Net開発


<< (VB.Net)COMオブジェ... Virtual Server2... >>