« 07.18 PropertyGridを操る(0) | ココ | 07.19 PropertyGridを操る(2) »

2007年7月19日

PropertyGridを操る(1)  このエントリーを含むはてなブックマーク 

PropertyGrid.SelectedObjectにあるオブジェクトを入れると、そのオブジェクトのPublic Property...で宣言されたプロパティが表示される。

  • PropertyGridに表示させないようにする場合は <Browsable(False)>
  • デザイン時読み込みのみにする場合は <[ReadOnly](True)>
  • resxファイルに保存させないようにするには <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>

とまあ、簡単に分かる属性はさておき。


ここでは、あるクラスSampleClassを、PropertyGridでプロパティを編集するクラスとして、利用する。このSampleClassに、いろいろプロパティを宣言して遊ぶ。

Class SampleClass

End Class

この状態で、 PropertyGrid1.SelectedObject = New SampleClass としても、何も表示されないのは当然。この状態から、プロパティを追加する。

  • デフォルト値以外が表示されるときに太字になるのを何とかしたい。

<DefaultValue(...)> もしくは、ShouldSerialize...メソッドを使うことで既定値を設定すると、既定値のときは太字にならない。『常に太字にならない』ようにするには、DefaultValueAttributeをいちいち操作することよりも、ShouldSerialize...メソッドを使った方が遥かに簡単。

Private _dat As String

Public Property SampleData1() As String
  Get
    Return _dat
  End Get
  Set(ByVal value As String)
    _dat = value
  End Set
End Property

Private Function ShouldSerializeSampleData1() As Boolean
  Return False
End Function

もちろん、シリアライズされなくなるのでシリアライズが必要な場合には適当な条件分岐が必要。

  • カテゴリ名を多言語化したい。

<Category("categoryName")> でカテゴリを指定できるけれども、カテゴリ名を多言語化する必要がある場合、CategoryAttributeから派生させたLocCategoryAttributeといったクラスを宣言し、GetLocalizedString()をオーバーライドする。

Public Class LocCategoryAttribute
  Inherits System.ComponentModel.CategoryAttribute

  Public Sub New(ByVal category As String)
    MyBase.New(category)
  End Sub

  Protected Overrides Function GetLocalizedString(ByVal value As String) As String
    Dim resman As Resources.ResourceManager = New Resources.ResourceManager("MyRes", Me.GetType.Assembly)
    Dim res = resman.GetString(value)
    If IsNothing(res) Then res = MyBase.GetLocalizedString(value)
    Return res
  End Function

End Class

  • 説明を多言語化したい。

プロパティの説明は、<Description("...")> でできると簡単に分かるんやけど、これが多言語化となるとCategoryのようなオーバーライドする関数がないからどうすればいいのか困る。けど、やり方としては同じ。DescriptionAttributeを派生させて、Descriptionプロパティをオーバーライドする。

Public Class LocDescriptionAttribute
  Inherits System.ComponentModel.DescriptionAttribute

  Public Sub New(ByVal description As String)
    MyBase.New(description)
  End Sub

  Public Overrides ReadOnly Property Description() As String
    Get
      ' Localizing process will be written here

      Return MyBase.Description
    End Get
  End Property

End Class

同様の解説が、コンポーネント開発者のための Tips その2(ref. 失われたアークを求めて)にもある。

By ただ at 03:14 カテゴリー ; さんぷるライブラリー , PinMarch Samples , VB, VB .net , プログラミング単語帳 , リンク , プログラミング

« 07.18 PropertyGridを操る(0) | 07月の記事 | 07.19 PropertyGridを操る(2) »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1031