« 07.19 PropertyGridを操る(1) | ココ | 07.20 雨上がり待ち »

2007年7月19日

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

PropertyGridをカスタマイズしたい、そんな貴方に送るヒント集。

  • プロパティの値を複数の項目から選択させたい。
  • ファイル/フォルダを選択するダイアログを出したい。
  • コマンドペイン(command pane, @ITではホット・コマンド領域)に、リンク形式のコマンドを表示したい。

今回はこの3つについて。またネタができたら追加するということで。


  • プロパティの値を複数の項目から選択させたい。

一番よくある「やりたいこと」だと思うんですが。この、一番単純そうなカスタマイズでさえも、別に派生クラスを定義してやらなければならないというのが、ハードル高いと思わせる原因だと思われ。めんどくさそう。

<TypeConverter(GetType(MyPropertyValueListConverter))> _
Public Property TextValue() As String
  Get

  End Get
  Set(ByVal Value As String)

  End Set
End Property

<Security.Permissions.PermissionSet(Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Friend Class MyPropertyValueListConverter
  Inherits StringConverter

  Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
    Dim arr As New ArrayList

    ' you can use "context.Instance" to get the owner object including this property.

    Return New StandardValuesCollection(arr)
  End Function

  Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
    Return True
  End Function
End Class

1つのTypeConverterにまとめておけるように、TypeConverterAttributeから派生クラスを作って、その中に必要なConverterを全部入れてしまう、というのもなくはないと思うけど…やっぱりめんどいことには変わりない。
なお、よくサンプルに出ているのはクラスに対してTypeConverterAttributeを指定して、GetStandardValues()メソッド中でcontext.PropertyDescriptorを使って分岐して各プロパティに対応した値の配列を返す方法。そっちの方がTypeConverterをたくさん作らなくていいけど、その分TypeConverterの中身が大きくなる。

  • ファイル/フォルダを選択するダイアログを出したい。

Windows.Forms.Design.FileNameEditorを使うと、ファイルを選択するコモンダイアログを表示し、選択されたファイルを自動的に設定することができるようになる。ただし、Windows.Forms.Design名前空間を呼び出すために、System.Design.dllを参照する必要がある。

Private _filename As String

<EditorAttribute(GetType(System.Windows.Forms.Design.FileNameEditor), GetType(System.Drawing.Design.UITypeEditor))> _
Public Property testFilename() As String
  Get
    Return _filename
  End Get
  Set(ByVal Value As String)
    _filename = Value
  End Set
End Property

FileNameEditorクラスを派生させて、InitializeDialog()メソッドをオーバーライドすることで、ダイアログの設定を変更することも可能。また、ファイル選択ダイアログのほかにも、フォルダを選択するダイアログを表示するFolderNameEditorクラスもある。ちなみに、FolderNameEditorクラスと同等のクラスを作るとすれば、下のようになる(IWindowsFormsEditorServiceのサンプルを改変)。

<Editor(GetType(MyFolderNameEditor), GetType(UITypeEditor))> _
Public Property FolderName() As String
  Get
    Return _folderName
  End Get
  Set(ByVal Value As String)
    _folderName = Value
  End Set
End Property

<Security.Permissions.PermissionSet(Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Friend Class MyFolderNameEditor
  Inherits UITypeEditor

  Public Overloads Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle
    Return UITypeEditorEditStyle.Modal
  End Function

  Public Overloads Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object
    Dim edSvc As IWindowsFormsEditorService = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)
    If edSvc Is Nothing Then
      Return Nothing
    End If

    Dim folderbrowser As New FolderBrowserDialog
    If folderbrowser.ShowDialog() = DialogResult.OK Then
      Return folderbrowser.SelectedPath
    End If

    ' If OK was not pressed, return the original value
    Return value

  End Function
End Class

ちなみに、自分で作ったコードの方が、

Dim folderbrowser As New FolderBrowserDialog
With folderbrowser
  .ShowNewFolderButton = False
  .SelectedPath = CStr(value)
  .Description = "Choose the folder."
End With

ということができる分、自由度が高い。

  • コマンドペイン(command pane, @ITではホット・コマンド領域)に、リンク形式のコマンドを表示したい。

Showing verbs in a PropertyGrid at Run-Time(ref. MBR IT/.NET 247)

System.ComponentModel.Design.DesignerVerbを利用することでできるらしい。

あと、

.NET Framework Visual Designers におけるコード生成のカスタマイズ (ref. MSDN)

というのもあった。Formとかを保存するときにデザイナが作るコードについての解説やけど、意外とPropertyGridとのつながりが深くて、それでいてPropertyGridの普通の解説よりも分かりやすい。

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

« 07.19 PropertyGridを操る(1) | 07月の記事 | 07.20 雨上がり待ち »




トラックバック

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