none
PropertyGridでチェックボックスを使いたい RRS feed

  • 質問

  • 現在Visual Studio2015(VB14)で開発を行っております。

    自作クラスのプロパティ設定にPropertyGridを使っているのですが、Boolean型のプロパティの設定が

    標準ではTrue/Falseを選択する形になっています。

    これをチェックボックスで操作するように変更したいのですが手段はあるのでしょうか。

    ご回答の程よろしくお願い致します。


    2015年8月24日 8:27

回答

  • まともにCheckBoxを配置しようとすると面倒です。
    それでもやるのであれば、PropertyGridのセルの座標を無理やり計算して、そこにCheckBoxを重ねて配置するという力技をする必要があります。
    #PropertyGrid.Controlsを掘っていくとTextBoxが見つかるのでそれに重ねる感じですが

    あえて難しい方法はとらずに以下のようにチェックボックスを表示するだけで済ませた方が楽だと思います。

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.PropertyGrid1.SelectedObject = New TestClass
        End Sub
    End Class
    
    
    Public Class TestClass
        'Sytstem.Drawing.dllを参照
        <System.ComponentModel.EditorAttribute(GetType(CheckBoxEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property Flag1 As Boolean
    End Class
    
    Public Class CheckBoxEditor
        Inherits System.Drawing.Design.UITypeEditor
    
        Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
            Return MyBase.EditValue(context, provider, value)
        End Function
    
        Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As Drawing.Design.UITypeEditorEditStyle
            Return Drawing.Design.UITypeEditorEditStyle.None
    
        End Function
        Public Overrides Function GetPaintValueSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True
        End Function
        Public Overrides Sub PaintValue(e As Drawing.Design.PaintValueEventArgs)
    
            Dim bs As ButtonState = ButtonState.Normal
            If (TypeOf e.Value Is Boolean) Then
                bs = IIf(CType(e.Value, Boolean), ButtonState.Checked, ButtonState.Normal)
            End If
            bs = bs Or ButtonState.Flat
            System.Windows.Forms.ControlPaint.DrawCheckBox(e.Graphics, e.Bounds, bs)
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2015年8月24日 12:01

すべての返信

  • まともにCheckBoxを配置しようとすると面倒です。
    それでもやるのであれば、PropertyGridのセルの座標を無理やり計算して、そこにCheckBoxを重ねて配置するという力技をする必要があります。
    #PropertyGrid.Controlsを掘っていくとTextBoxが見つかるのでそれに重ねる感じですが

    あえて難しい方法はとらずに以下のようにチェックボックスを表示するだけで済ませた方が楽だと思います。

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.PropertyGrid1.SelectedObject = New TestClass
        End Sub
    End Class
    
    
    Public Class TestClass
        'Sytstem.Drawing.dllを参照
        <System.ComponentModel.EditorAttribute(GetType(CheckBoxEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property Flag1 As Boolean
    End Class
    
    Public Class CheckBoxEditor
        Inherits System.Drawing.Design.UITypeEditor
    
        Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
            Return MyBase.EditValue(context, provider, value)
        End Function
    
        Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As Drawing.Design.UITypeEditorEditStyle
            Return Drawing.Design.UITypeEditorEditStyle.None
    
        End Function
        Public Overrides Function GetPaintValueSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True
        End Function
        Public Overrides Sub PaintValue(e As Drawing.Design.PaintValueEventArgs)
    
            Dim bs As ButtonState = ButtonState.Normal
            If (TypeOf e.Value Is Boolean) Then
                bs = IIf(CType(e.Value, Boolean), ButtonState.Checked, ButtonState.Normal)
            End If
            bs = bs Or ButtonState.Flat
            System.Windows.Forms.ControlPaint.DrawCheckBox(e.Graphics, e.Bounds, bs)
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2015年8月24日 12:01
  • ありがとうございます。

    チェックボックスの絵だけ表示して見た目わかりやすくするということなんですね。

    試したところ無事表示させることが出来ました。

    ありがとうございます、大変参考になりました。

    2015年8月25日 0:21