VB のたまご

作成日: 2018/11/07, 更新日: 2018/11/07


UI 型エディタ

  • この投稿は Visual Basic Advent Calendar 2018 の 10 日目の記事です。
    ・ 9 日目の記事:
    ・ 11 日目の記事: フォームデザイナ

  •  UI 型エディタは、任意の型のデータを設定するための入力支援画面を提供します。 例えば、ComboBox, ListBox の Items コレクションプロパティ向けの文字列コレクションエディターや、 TreeView の Nodes コレクションプロパティ向けの TreeNode エディターなどです。

  •  ここでは、こういう画面を作成します。以下サンプルです。
  • Imports System.ComponentModel
    Imports System.Drawing.Design
    Imports System.Windows.Forms.Design
    
    
    ' 自前コントロールをターゲットとします。
    Public Class TextBoxEx
        Inherits TextBox
    
        ' プロパティウィンドウに Text2 プロパティを表示する際、入力支援画面を付与する
        <Editor(GetType(InputFormEditor), GetType(UITypeEditor))>
        Public Property Text2 As String
    
        <Editor(GetType(InputFormEditor), GetType(UITypeEditor))>
        Public Overrides Property Text As String
            Get
                Return MyBase.Text
            End Get
            Set(value As String)
                MyBase.Text = value
            End Set
        End Property
    
    End Class
    
    ' 任意の型の初期値データを入力するための支援機能
    ' ここでは、文字列を入力支援するための画面を提供する
    Public Class InputFormEditor
        Inherits UITypeEditor
    
        ' 入力支援画面をどのように表示するか。モーダル表示か、プロパティウィンドウ下部か(コンボボックスの選択リスト)
        Public Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
            Return UITypeEditorEditStyle.Modal
        End Function
    
        ' 入力支援画面を表示して、変更なし(既存値)、または新しい値を返却します。
        Public Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
    
            Dim service = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService)
            If service Is Nothing Then
                Return Nothing
            End If
    
            Using dlg = New InputForm
                dlg.CurrentValue = CStr(value) ' Nothing の場合があるので、ToString() だとダメ
                If service.ShowDialog(dlg) = DialogResult.OK Then
                    Return dlg.NewValue
                End If
            End Using
    
            Return value
    
        End Function
    
    End Class
    

  •  入力支援画面となる InputForm 画面クラスは省略しますが、簡単なやり取り画面です。 入力支援機構を作成するには、System.Drawing.Design.UITypeEditor を継承して作成します。 この支援を受けたいコントロールの該当メンバーに、属性として付与して使います。

  •  UI 型エディタでは、表示する形式(モーダル画面表示、コンボボックスのドロップダウン)を決定することと、編集処理を作成します。 ここでは入力支援画面をモーダル表示するようにしますが、入力支援画面を直接モーダル表示させるのではなく、IWindowsFormsEditorService インターフェースを利用してモーダル表示をおこないます。

  • イメージ
  •  こんな感じです。

  •  入力支援画面をドロップダウン形式で表示する版は省略します。興味がある方は GitHub をご参照ください。 例えば Anchor プロパティがドロップダウン形式ですね。実行するとこんな感じです。

  • イメージ
  •  ダークだとつらいorz