« 07.19 PropertyGridを操る(1) | ココ | 07.20 雨上がり待ち »
2007年7月19日
PropertyGridを操る(2)
PropertyGridをカスタマイズしたい、そんな貴方に送るヒント集。
- プロパティの値を複数の項目から選択させたい。
- ファイル/フォルダを選択するダイアログを出したい。
- コマンドペイン(command pane, @ITではホット・コマンド領域)に、リンク形式のコマンドを表示したい。
今回はこの3つについて。またネタができたら追加するということで。
- プロパティの値を複数の項目から選択させたい。
一番よくある「やりたいこと」だと思うんですが。この、一番単純そうなカスタマイズでさえも、別に派生クラスを定義してやらなければならないというのが、ハードル高いと思わせる原因だと思われ。めんどくさそう。
<TypeConverter(GetType(MyPropertyValueListConverter))> _
Public Property TextValue() As String
GetEnd Get
Set(ByVal Value As String)End Set
End Property<Security.Permissions.PermissionSet(Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Friend Class MyPropertyValueListConverter
Inherits StringConverterPublic 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 FunctionPublic 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 UITypeEditorPublic Overloads Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle
Return UITypeEditorEditStyle.Modal
End FunctionPublic 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 IfDim 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 valueEnd 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