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オブジェクトはテーブル全体、コンテント、レコード、 フィールドなどに持つことができます。ただし、以下のプロパティはテー ブル全体にのみ設定可能です。
HeaderContentBackColor | HeaderContentの背景色 |
FooterContentBackColor | FooterContentの背景色 |
ContentBackColor | Contentの背景色 |
ResizingLineColor | 列のサイズ変更時に現れる線の色 |
UserColAdjustable | ユーザが見出し列の境界線をダブルクリックすることで列幅の自動調整を行うか |
UserColResizable | ユーザが見出し列の境界線をドラッグすることで列幅の変更を行うか |
UserSortable | ユーザが見出しフィールドをダブルクリックすることでソートを行うか(デフォルトはDisable) |
AutoEntryFocus | どのフィールドもフォーカスを得ていない状態でテーブルにフォーカスが移った場合、自動的に0レコード目のフィールドがフォーカスを得るようにするか |
EntryFocusKey | AutoEntoryFocusが行われたときにフォーカスを得るフィールドのキー。Nothingならば左端のフィールドが選択される |
VBorderLineDot | フィールド境界線の縦線を点線とするか |
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.Record | Fieldを含むレコード |
Field.Content | Fieldを含むコンテント |
Field.Table | Fieldを含むテーブル |
以下のコードでFieldと同じレコードの[ID]フィールドを得ることができます。
Field.Record.Fields("ID")
以下のコードでFieldがコンテントの何レコード目にあるかを得ることができます。
Field.Content.Records.IndexOf(Field.Record)
レコードも同様に、自身を含むコンテントやテーブルへの参照を持っています。
Record.Content | Recordを含むコンテント |
Record.Table | Recordを含むテーブル |
さらに、コンテントも自身を含むテーブルへの参照を持っています。
Content.Table | Contentを含むテーブル |
多くのレコードを追加する場合などで、追加のたびに再描画が発生して パフォーマンスが低下することがあります。そうした場合は、以下のよ うに書くことで再描画をブロックできます。
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列をスクロールしないようにする