UTable .NET Framework用 表入力コンポーネント
ドキュメント

カスタムフィールド

この項では、独自のフィールドプロバイダを作成する方法について説明します。 フィールドプロバイダを作成することで、独自の形式のフィールドを利用することができるようになります。

CFieldProviderクラス

フィールドプロバイダはIFieldProviderインターフェースを実装することで作成できます。 ただし、通常は代表的な実装クラスであるCFieldProviderクラスを継承して作成してください。 CFieldProviderクラスには、サブクラスから利用されることを想定した有用なメソッドがいくつか含まれています。

CFieldProviderクラスの重要なメソッドを以下に示します。 これらのメソッドは全てオーバーライド可能です。

メソッド説明
CreateField() フィールドを生成して返します
FieldInitialize(field) フィールドの初期化を行います
フィールドが生成された直後に呼ばれます
CreateEditor() エディタを生成して返します
Nothingを返すと、編集不可のフィールドとなります
EditorInitialize(field, editor) エディタの初期化を行います
エディタが生成された直後に呼ばれます
Setting() 必要ならばセッティングを生成して返します
このメソッドが返したセッティングは、フィールドディスクリプタに設定されます
Focusable() フィールドがフォーカスを得ることができるかを返します
ImeMode() IMEモードを返します
RenderOrder() フィールドが描画される順を返します
デフォルトでは0を返します
CCaptionFieldProviderでは1を返すようになっています
このメソッドは0か1のどちらかの値を返さなければいけません
Render(g, field, rect, alter) フィールドを描画します
valueFormat(value) フィールドの値を表示形式にフォーマットして返します
このメソッドはRenderメソッドから利用されます
GetAdjustSize(g, field) アジャストされるサイズを返します

フィールドプロバイダには他に、以下のプロパティを持ちます。 これらはオーバーライドできません。

メソッド説明
Caption 見出し文字列を設定・取得します
この値はテーブルのCreateCaptionメソッドから利用されます
TabOrder フィールドのフォーカス移動順を設定・取得します

サンプル 数値のカンマ編集

以下のようなフィールドを生成してみましょう。

水平方向アライメントを右寄せとし、フィールドの値をカンマ編集して表示します。

フィールドプロバイダの定義は以下のようになります。 アライメントの制御はSettingで行います。 また、カンマ編集はformatValueメソッドで行います。

  Class CCammaFieldProvider
    Inherits CFieldProvider

    'Captionをコンストラクタに渡せるようにする
    Public Sub New(ByVal caption As String)
        MyBase.New(caption)
    End Sub

    Protected Overrides Function formatValue(ByVal v As Object) As String
        Return Format(v, "#,###")
    End Function

    Public Overrides Function Setting() As UTable.CSetting
        Dim s As New UTable.CSetting
        s.HorizontalAlignment = UTable.EHAlign.RIGHT
        Return s
    End Function

 End Class

フィールドの描画

フィールドの描画はRenderメソッドで行われます。 このメソッドをオーバーライドすることで、フィールドの外観を自由に制御することができるようになります。 Renderメソッドからは以下のメソッドが利用されます。 これらのメソッドは全てSharedです。

メソッド説明
BackColor(field, setting, alter) フィールドの背景色を返します
ForeColor(field, setting, alter) フィールドの前景色を返します
CaptionBackColor(field, setting, drag) 見出しフィールドの背景色を返します
CaptionForeColor(field, setting, drag) 見出しフィールドの前景色を返します
RenderBackgroud(g, field, rect, color) フィールドの背景を描画します
RenderBorder(g, rect, borderLine, color, style) フィールドの境界線を描画します
RenderValue(g, field, rect,
         formattedValue, color, font, stringFormat)
フィールドの値を描画します
RenderCaptionBackgroud(g, field, rect, color, style) 見出しフィールドの背景を描画します
RenderCaptionBorder(g, rect, borderLine, color) 見出しフィールドの境界線を描画します
RenderCaptionValue(g, field, sortState, rect,
         formattedValue, color, font, stringFormat)
見出しフィールドの値を描画します
RenderCheckBox(g, rect, value) チェックボックスを描画します
RenderNarrowChild(g, rect, value) ナローイングボックスを描画します

参考のために、Renderメソッドのデフォルトの実装を以下に示します。

    Public Overridable Sub Render(ByVal g As Graphics, _
                                  ByVal field As UTable.CField, _
                                  ByVal rect As Rectangle, _
                                  ByVal alter As Boolean) _
                                  Implements IFieldProvider.Render
        Dim s As UTable.CDynamicSetting = field.DynamicSetting
        RenderBackgroud(g, field, rect, BackColor(field, s, alter))
        RenderBorder(g, rect, Me.BorderLine, _
                     field.Table.Setting.BorderColor, field.Table.Setting.BorderStyle)
        If field.Editor Is Nothing Then
            RenderValue(g, field, rect, Me.formatValue(field.Value), _
                        ForeColor(field, s, alter), s.Font, s.GetStringFormat)
        End If
    End Sub

デフォルトのRenderメソッドではまず、フィールドの動的セッティングを生成しています。 これにより、フィールドに設定されるべきフォントや色などを取得することができます。 次に、背景と境界線を描画します。 最後に、そのフィールドが編集モードでない時に限り、フィールドの値を描画します。 背景色と前景色はそれぞれ、BackColorとForeColorメソッドで得ます。 このメソッドは、そのフィールドがフォーカスを得ているか否かや、 レコードのインデックスが偶数なのか奇数なのかといった条件から色を決定します。

サンプル グラフ表示

以下のようなフィールドを生成してみましょう。

Renderメソッドをオーバーライドし、グラフが描画されるようにします。 また、アジャストを行ったときに、グラフがちょうど収まるサイズに調整されるようにします。

フィールドプロバイダの定義は以下のようになります。 Renderメソッドをオーバーライドし、RenderValueを呼ぶ代わりに、グラフの矩形を描画します。 また、GetAdjustSizeをオーバーライドし、アジャストのサイズを返します。

    Class CGraphFieldProvider
        Inherits CFieldProvider

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

        Public Overrides Sub Render(ByVal g As System.Drawing.Graphics, _
                                    ByVal field As UTable.CField, _
                                    ByVal rect As Rectangle, _
                                    ByVal alter As Boolean)                                    
            Dim s As UTable.CDynamicSetting = field.DynamicSetting
            RenderBackgroud(g, field, rect, BackColor(field, s, alter))
            RenderBorder(g, rect, Me.BorderLine, _
                         field.Table.Setting.BorderColor, field.Table.Setting.BorderStyle)
            g.SetClip(rect)
            Dim l As Integer = field.Value * 10
            If l > 0 Then
                Using b As New SolidBrush(Color.SteelBlue)
                    g.FillRectangle(b, New Rectangle(rect.X, rect.Y + 5, l, rect.Height - 10))
                End Using
            End If    
            g.ResetClip()
        End Sub

        Public Overrides Function GetAdjustSize(ByVal g As System.Drawing.Graphics, _
                                                ByVal field As systembase.table.UTable.CField) _
                                                As System.Drawing.Size
            Return New Size(field.Value * 10, field.Table.DefaultGridSize.Row)
        End Function

    End Class    

次へ    ドキュメントのトップ / ホーム


Copyright (c) 2009, SystemBase Co.,Ltd.
All rights reserved.