機能引きリファレンス

レコードを追加・移動・削除するには

Contentの最後にレコードを追加するには次のようにします。

      Content.AddRecord()

指定した位置にレコードを挿入するには次のようにします。

      Content.InsertRecord(10) '10行目に行を挿入

これらのメソッドは戻り値として追加したレコードのオブジェクトを返 します。例えば次のコードで、追加した行に行番号を振ることができま す。

      For i As Integer = 1 to 10
          Content.AddRecord().Fields("rowNo").value = i
      Next

次のように書くと、最後に追加されたレコードを取得することができま す。

      r = Content.LastAddedRecord

レコード位置を移動できます。

      Content.MoveRecord(5, 10) '5行目のレコードを10行目に移動
      Content.MoveRecord(Content.records(10), 5) '10行目のレコードを5行目に移動

レコードを削除するには次のようにします。

      Content.RemoveRecord(5) '5行目のレコードを削除
      Content.RemoveRecord(Content.records(10)) '10行目のレコードを削除

全てのレコードを削除するには次のようにします。

      Content.ClearRecord()

レコードだけでなくレコードプロバイダも含めてクリアするには次のよ うにします。レコードプロバイダを置き換える場合は、いったん必ずこ の操作をする必要があります。

      Table.ResetAll()

フィールドの値を読み書きするには

例えば、Content内の10行目にある[ID]フィールドの値を読み書きするに は以下のようにします。

      v = Content.Records(10).Fields("ID").Value
      Content.Records(10).Fields("ID").Value = v

値を空にするClearメソッドもあります。デフォルトではNothingが代入 されますが、この動作をオーバーライドすることもできます。

      Content.Records(10).Fields("ID").Clear

指定したフィールドにフォーカスを移すには

Table.FocusFieldプロパティで、フォーカスを得ているフィールドを設 定・取得できます。

      Table.FocusField = Field
      Field = Table.Focusfield
      Table.FocusField = Nothing 'どのフィールドもフォーカスを得ていない状態にする

フィールドのフォント、色、アライメントなどを変更するには

フォント、色、アライメントなどのプロパティはSettingオブジェクトに 持ちます。全てのプロパティを以下に紹介します。

Fontフォント
CaptionFont見出しのフォント
ForeColor前景色
CaptionForeColor見出しの前景色
BackColor奇数行の背景色
AlterBackColor偶数行の背景色
CaptionBackColor見出しの背景色
ButtonBackColorボタンの背景色
BorderColor境界線の色
CaptionBorderColor見出しフィールドの境界線の色
DraggingColorレコードをドラッグしているときの背景色
FocusColorフォーカスを得ているときの背景色
FocusRecordColorレコードがフォーカスを得ているときの背景色
HorizontalAlignment水平方向のアライメント
VerticalAlignment垂直方向のアライメント
Editable編集可能か
FocusStopフォーカスを移動させるか
TextWrap内容を折り返して表示するか
FocusColorEnabledフォーカスを得ている場合、背景色を変えるか
FocusRecordColorEnabled同じレコードがフォーカスを得ている場合、背景色を変えるか

UTableのアーキテクチャで説明したと おり、Settingオブジェクトはテーブル全体、コンテント、レコード、 フィールドなどに持つことができます。ただし、以下のプロパティはテー ブル全体にのみ設定可能です。

HeaderContentBackColorHeaderContentの背景色
FooterContentBackColorFooterContentの背景色
ContentBackColorContentの背景色
ResizingLineColor列のサイズ変更時に現れる線の色
UserColAdjustableユーザが見出し列の境界線をダブルクリックすることで列幅の自動調整を行うか
UserColResizableユーザが見出し列の境界線をドラッグすることで列幅の変更を行うか
UserSortableユーザが見出しフィールドをダブルクリックすることでソートを行うか(デフォルトはDisable)
AutoEntryFocusどのフィールドもフォーカスを得ていない状態でテーブルにフォーカスが移った場合、自動的に0レコード目のフィールドがフォーカスを得るようにするか
EntryFocusKeyAutoEntoryFocusが行われたときにフォーカスを得るフィールドのキー。Nothingならば左端のフィールドが選択される
VBorderLineDotフィールド境界線の縦線を点線とするか

UTableが発生させるイベント

UTableは次のイベントを発生します。

RecordAdded(ByVal record As CRecord) レコードが追加されると発生します
RecordMoved(ByVal record As CRecord) レコードの移動が行われると発生します
RecordRemoved(ByVal record As CRecord) レコードが削除されると発生します
EditorValueChanged(ByVal field As CField) エディタ上で値が変更されると発生します
RecordEnter(ByVal record As CRecord) レコード上のいずれかのフィールドがフォーカスを得ると発生します
FieldEntering(ByVal field As CField, ByRef cancel As Boolean) フィールドがフォーカスを得る直前に発生します。cancel = trueとすることで、フォーカスを得ることを禁止できます
FieldEnter(ByVal field As CField) フィールドがフォーカスを得ると発生します
EditStarting(ByVal field As CField, ByRef editable As CSetting.EEditable) 編集モードに入る直前に発生します。Setting.Editable = Disable と設定されたフィールドについても必ずこのイベントは発生します。イベントハンドラ内でeditableを書き換えることで、編集可能かどうかを動的に制御できます
EditFinished(ByVal field As CField) 編集モードが終了すると発生します
FieldMouseDown(ByVal field As CField, ByVal location As Point, ByVal e As MouseEventArgs) フィールド上でマウスのボタンが押されると発生します。locationにはフィールド内の座標が渡されます
FieldMouseUp(ByVal field As CField, ByVal location As Point, ByVal e As MouseEventArgs) フィールド上でマウスのボタンが放されると発生します。locationにはフィールド内の座標が渡されます
FieldMouseMove(ByVal field As CField, ByVal location As Point, ByVal e As MouseEventArgs) フィールド上でマウスカーソルが動くと発生します。locationにはフィールド内の座標が渡されます
FieldClick(ByVal field As CField, ByVal location As Point, ByVal e As MouseEventArgs) フィールド上でクリックが行われると発生します。locationにはフィールド内の座標が渡されます
FieldDoubleClick(ByVal field As CField, ByVal location As Point, ByVal e As MouseEventArgs) フィールド上でダブルクリックが行われると発生します。locationにはフィールド内の座標が渡されます
FieldKeyDown(ByVal field As CField, ByVal e As KeyEventArgs) フィールドがフォーカスを得ている状態でキーが押されると発生します
FieldKeyUp(ByVal field As CField, ByVal e As KeyEventArgs) フィールドがフォーカスを得ている状態でキーが放されると発生します
FieldValidating(ByVal field As CField, ByVal e As CancelEventArgs) エディタのValidatingイベントによって発生します。e.Cancel = Trueとすることで、編集モードの終了をキャンセルできます
FieldSelected(ByVal field As CField, ByRef handled As Boolean) フィールド上でEnterキーが押されるか、ダブルクリックが行われると発生します。handled = Trueとすることで、この操作による処理(編集モードに移行するなど)を中断できます。
FieldButtonClick(ByVal field As CField) ボタンフィールドが押されると発生します
Sorted(ByVal content As CContent, ByVal key As Object) ソートが行われると発生します

指定したフィールド、レコードを含むコンテント、テーブルを得るには

フィールドは自身を含むレコード、コンテント、テーブルへの参照を持っています。

Field.RecordFieldを含むレコード
Field.ContentFieldを含むコンテント
Field.TableFieldを含むテーブル

以下のコードでFieldと同じレコードの[ID]フィールドを得ることができます。

      Field.Record.Fields("ID")

以下のコードでFieldがコンテントの何レコード目にあるかを得ることができます。

      Field.Content.Records.IndexOf(Field.Record)

レコードも同様に、自身を含むコンテントやテーブルへの参照を持っています。

Record.ContentRecordを含むコンテント
Record.TableRecordを含むテーブル

さらに、コンテントも自身を含むテーブルへの参照を持っています。

Content.TableContentを含むテーブル

再描画をブロックするには

多くのレコードを追加する場合などで、追加のたびに再描画が発生して パフォーマンスが低下することがあります。そうした場合は、以下のよ うに書くことで再描画をブロックできます。

       Using Table.UpdateBufferBlock
            For i As Integer = 0 To 100
                Table.Content.AddRecord()
            Next
       End Using

再描画は、Using句を抜けた時点で一度だけ行われます。また、Using句 の中でさらにUpdateBufferBlockのUsing句が存在した場合、外側の句を 抜けた時点でのみ再描画が行われます。

       Using Table.UpdateBufferBlock
           For i As Integer = 0 To 10
               addRecords(Table)
           Next
       End Using ' 再描画される

       ...

       Sub addRecords(Table As UTable)
            Using Table.UpdateBufferBlock
                For i As Integer = 0 To 10
                    Table.Content.AddRecord()
                Next
            End Using ' 再描画されない
       End Sub

見出し行を制御するには

見出しは、HeaderContentに作られたCaptionProviderによるフィールド で表現されます。CreateCaptionメソッドで、Contentに設定されたレコー ドプロバイダの定義を元に、HeaderContent内に見出しフィールドを生成 することができます。CreateCaptionメソッドには、見出しフィールドに 適用される水平方向のアライメントを引数として指定できます。この引 数を省略すると、Contentのフィールドと同じアライメントになります。

レコードプロバイダには、見出しの生成方法を制御するプロパティがあ ります。

CreateCaption 見出しを生成するか
MergeCaption 見出しをマージする場合、対象となるフィールドのキー

例を以下に示します。

        Dim rp As New UTable.CRecordProvider
        With New CFieldBuilder
            rp.AddField(0, .Field("項目1"), .Next)
            rp.AddField(1, .Field("項目2"), .Next).MergeCaption = 2
            rp.AddField(2, .Field("項目3"), .Next).CreateCaption = False
            rp.AddField(3, .Field("項目4"), .Next)
        End With
        Me.Table.Content.SetRecordProvider(rp)
        Me.Table.CreateCaption()

        Using Me.Table.UpdateBufferBlock
            For i As Integer = 0 To 10
                Me.Table.Content.AddRecord()
            Next
	End Using

CreateCaptionでは生成できないような見出しを作成する場合は、直接 HeaderContentにフィールドを追加します。Table.CaptionRecordメソッ ドで、HeaderContentの0行目のレコードを得ることができます。こうし た場合、対応するフィールドとキーを一致させておかないと、ソート機 能を利用できなくなります。

        Dim rp As New UTable.CRecordProvider
        With New CFieldBuilder
            rp.AddField(1, .Field(), .Next)
            rp.AddField(2, .Field(), .Next)
            rp.AddField(3, .Field(), .Next)
        End With
        Me.Table.Content.SetRecordProvider(rp)

        Dim c As UTable.CRecord = Me.Table.CaptionRecord
        With New CFieldBuilder
            c.AddField(0, .Caption("項目"), .Next(3))
            c.AddField(1, .Caption("項目1"), .Break.Next)
            c.AddField(2, .Caption("項目2"), .Next)
            c.AddField(3, .Caption("項目3"), .Next)
        End With

        Using Me.Table.UpdateBufferBlock
            For i As Integer = 0 To 10
                Me.Table.Content.AddRecord()
            Next
        End Using

列・行のサイズを変更するには

全てのフィールドはグリッドと呼ばれる枠にそって配置されます。グリッ ドはCol(列)とRow(行)からなり、Colは全てのレコードで共有され、 Rowはレコードごとに保持されます。

0番目のColの幅を変更するには次のようにします。

      Table.Cols(0).Size = 200

複数行明細とした場合、1つのレコードには複数のRowが含まれることに なります。例えば、0レコード目の1番目のRowの高さを変更するには次の ようにします。

      Content.Records(0).Rows(1).Size = 50

各フィールドは自身が配置されているColとRowを取得できます。ただし、 フィールドは複数のグリッドにまたがって配置されているかもしれませ ん。その場合、これらの参照は右下端のグリッドを返します。

      Field.Col.Size = 200
      Field.Row.Size = 50

複数のCol幅を設定したい場合はSetSizeメソッドを使うと便利です。こ のメソッドには、可変個の引数を渡すことができ、指定された引数の数 だけ左から順に列幅が設定されます。

      Table1.Cols.SetSize(50, 100, 100, 200)

デフォルトのCol幅とRowの高さは、次のコードで設定できます。この操 作はレコードが作られるよりも前に行われる必要があります。

      Table.DefaultGridSize.Col = 100
      Table.DefaultGridSize.Row = 50

Row, ColにはSize以外に次のメンバを持っています。

SizeMax幅または高さの最大値
SizeMin幅または高さの最小値
Resizable幅または高さの変更を許すか
UserResizableユーザの操作による幅または高さの変更を許すか。ResizableがTrueのときのみこのプロパティは有効です
UserAdjustableユーザの操作による列幅自動調整を許すか。Colにおいてのみこのプロパティは有効です
Visibleこの列または行を表示するか

列幅を内容に合わせて自動調整するには

列幅を内容に合わせて調整するには、以下のように書きます。

      Table.AdjustSize(0) '0列目の幅を調整
      Table.AdjustSize()  '全ての列の幅を調整

前述しましたが、Table.Setting.UserColAdjustable = Trueとすること で、ユーザが見出しフィールドの境界線をダブルクリックしたときに、 列幅調整が行われます。なお、この設定はデフォルトでTrueとなってい ます。

以下の設定をすることで、フィールドの値が変更されるたびに列幅また は行高さの自動調整を行うこともできます。ただしこの場合は、サイズ の拡張のみが行われます。内容が短くなったとしても自動的に狭められ ることはありません。

      Table.AutoAdjust.Col = True '列幅の自動調整を行う
      Table.AutoAdjust.Row = True '行高さの自動調整を行う

ソートするには

以下のコードで、指定したキーのフィールドの値によってレコードのソー トを行うことができます。

      Content.Sort("ID", UTable.CSortState.EOrder.ASCEND) '昇順にソート。降順はDESCEND

レコードの大小関係を決めるコンペアラを独自に作成して与えることも できます。コンペアラは必ずUTable.CContent.CComparerを継承して作成 してください。

例えば、以下の表を用意します。

        Dim rp As New UTable.CRecordProvider
        With New CFieldBuilder
            rp.AddField("chk", .Check("check"), .Next)
            rp.AddField("nm", .Text, .Next)
        End With
        Me.Table.Content.SetRecordProvider(rp)

まずチェック状態によるソートが行われ、その中でさらに名前によるソー トが行われるようにしてみましょう。

以下のコンペアラを作成して利用します。

    Class CComparerEx
        Inherits UTable.CContent.CComparer
        Public Overrides Function Compare(ByVal x As Integer, ByVal y As Integer) As Integer
            If Me.records(x).Fields("chk").Value <> Me.records(y).Fields("chk").Value Then
                Return Me.records(x).Fields("chk").Value < Me.records(y).Fields("chk").Value
            Else
                Return MyBase.Compare(x, y)
            End If
        End Function
    End Class
      Content.Sort("nm", UTable.CSortState.EOrder.ASCEND, new CComparerEx)

前述しましたが、Table.Setting.UserSortable を Allow にするとユー ザが見出しフィールドをダブルクリックしたときにソートが行われるよ うになります。なお、このデフォルト値はDisableです。

見出しフィールドのフィールドプロバイダにコンペアラを渡しておくと、 ダブルクリックでのソート時に利用されるようになります。

      CType(Me.UTable.CaptionRecord.Fields(1).Desc.Provider, CCaptionFieldProvider).Comparer = New CComparerEx

スクロールしない列を作るには

以下の設定をすることでスクロールしない列を作ることができます。

      Table.FixedCols = 2 '左2列をスクロールしないようにする

目次へ戻る