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

コンテントとレコードの操作

この項では、コンテント、レコードに用意されている メソッドやプロパティについて説明します。

レコードの追加・削除・移動

コンテントに含まれるレコードはRecordsリスト内に格納されています。 ただし、このRecordsリストの要素を直接追加・削除・移動しないでください。 代わりに、コンテントに用意された以下のメソッドを利用してください。

メソッド説明
ClearRecord() すべてのレコードを削除します
CreateRecord()
CreateRecord(rp)
レコードを作成して返します
作成されたレコードはAddRecordまたはInsertRecordでコンテントに追加することができます
ただし、あるコンテントで作成されたレコードを別のコンテントに追加はしないでください
AddRecord()
AddRecord(rp)
AddRecord(record)
Recordsの最後にレコードを追加します
デフォルトでは、コンテントに設定されたレコードプロバイダによってレコードは初期化されますが、
引数rpに初期化に用いるレコードプロバイダを指定することもできます
CreateRecordで作製されたレコードを引数recordに指定して追加することもできます
このメソッドは追加されたレコードを返します
InsertRecord(i)
InsertRecord(i, record)
InsertRecord(i, rp)
iの位置にレコードを追加します
追加されたレコードを返します
MoveRecord(i1, i2)
MoveRecord(record, i2)
i1の位置にあるレコードをi2の位置に移動します
引数recordに移動するレコードを指定することもできます
recordはこのコンテントに含まれているレコードである必要があります
RemoveRecord(i)
RemoveRecord(record)
iの位置にあるレコードを削除します
引数recordに削除するレコードを指定することもできます
recordはこのコンテントに含まれているレコードである必要があります

コンテントには、最後に追加されたレコードを返すLastAddedRecordというプロパティがあります。

    record = Content.LastAddedRecord

ただし、このプロパティが返すレコードは常に存在するとは限らないことに注意してください。 例えば、あるレコードを追加した直後に削除した場合などは、 そのレコードは既にコンテント内に存在しないことになります。 なお、LastAddedRecordプロパティは、CrearRecordメソッドが実行されるとNothingとなります。

コンテント・レコード・フィールドの参照

フィールドは自身を含んでいるレコード・コンテント・テーブルへの参照を持っています。 また、レコードは自身を含むコンテント・テーブルへの参照を持っています。 そういった親子関係をたどるためのプロパティまたはメソッドを以下に示します。

プロパティまたはメソッド説明このプロパティを持つ要素
Table 自身を含むテーブルを返します コンテント、レコード、フィールド
Content 自身を含むコンテントを返します レコード、フィールド
Record 自身を含むレコードを返します フィールド
ParentRecord 自身をChildとして持つ親レコードを返します コンテント
TopLevelContent 先祖をたどっていき、最も上のコンテントを返します
この参照はTable.ContentまたはTable.HeaderContent
またはTable.FooterContentのいずれかを必ず示します
コンテント、レコード、フィールド
TopLevelRecord 先祖をたどっていき、最も上のレコードを返します コンテント、レコード、フィールド
Level 自身の階層の深さを返します
自身がTopLevelContentならば0を返します
コンテント
IsChild(content)
IsChild(record)
IsChild(field)
与えられたcontentまたはrecordまたはfieldが、
自身の子孫かを再帰的に調査します。
コンテント、レコード、フィールド

表示・非表示の制御

コンテントとレコードはVisibleプロパティで表示・非表示を制御することができます。

よく利用されるのは、階層構造における子コンテントを非表示にするといった操作です。 以下のように書きます。

    Record.Child.Visible = False

ソート

コンテントのSortメソッドを呼ぶことで、レコードのソートを行うことができます。 Sortメソッドには以下のオーバーロードがあります。

    Content.Sort(key)                  'keyに対応するフィールドのValueで昇順にソートする
    Content.Sort(key, order)           'orderに昇順(ASCEND)か降順(DESCEND)を指定
    Content.Sort(key, order, comparer) 'コンペアラを指定

comparerにはUTable.CComparerクラスか、 これを継承したクラスのオブジェクトを指定します。 comparerが指定されなかった場合は、 存在するならばレコードプロバイダの対応するフィールドディスクリプタが持つ Comparerが利用されます。 存在しなければテーブルのComarerが利用されます。

UTable.CComparerクラスには、 Nothing値をどのように扱うかを制御するプロパティNullRuleが定義されています。 NullRuleのとり得る値は以下の通りです。

説明
ASCEND Nothingを他のどの値よりも小さな値として扱います
この値がデフォルト値です
DESCEND Nothingを他のどの値よりも大きな値として扱います
ASCEND_ALWAYS Sortメソッドの引数orderの値に関わらず
Nothing値が常にリストの先頭に来るようにします
DESCEND_ALWAYS Sortメソッドの引数orderの値に関わらず
Nothing値が常にリストの最後に来るようにします

ユーザ操作によるソート

Table.Setting.UserSortableをALLOWとすることで、 ユーザが見出しフィールドをダブルクリックした時にcontentのレコードが ソートされるようになります。 特定のフィールドがダブルクリックされた時のみソート可能としたいといった場合は、 フィールドディスクリプタのUserSortableをALLOWとします。

UserSortableとComparerを設定するコード例を以下に示します。

    Table.Setting.UserSortable = UTable.EAllow.ALLOW
    Table.Comparer = myComparer
    With rp.AddField(key, New CFieldProvider, .Next)
        .UserSortable = UTable.EAllow.ALLOW
        .Comparer = myComparer
    End With

Table.Setting.UserSortableをALLOWとし、 あるフィールドのUserSortableをDISABLEとするといったこともできます。 この場合、指定されたフィールドの見出しだけがダブルクリックに反応しなくなります。

サンプル

以下のようなサンプルを作成してみましょう。 ユーザがnameの見出しをダブルクリックすると、 まずcheckの状態でソートされた後にnameでソートされるようにします。

このような特殊なソートを行うには、コンペアラを作成する必要があります。 前述しましたが、コンペアラはUTable.CComparerクラスを継承して作成します。 なお、UTable.CComparerクラスはrecords, key, orderというプロパティを持っています。 recordsはソートの対象となるレコードのリスト。 key, orderはSortメソッドの引数に渡されたkeyとorderの値です。

    Class CSampleComparer
        Inherits UTable.CComparer
        Public Overrides Function Compare(ByVal x As Integer, ByVal y As Integer) As Integer
            Dim checkX As Object = Me.records(x).Fields("check").Value
            Dim checkY As Object = Me.records(y).Fields("check").Value
            If checkX <> checkY Then
                Select Case Me.order
                    Case UTable.CSortState.EOrder.ASCEND
                        Return checkX < checkY
                    Case UTable.CSortState.EOrder.DESCEND
                        Return checkX > checkY
                End Select
            Else
                Return MyBase.Compare(x, y)
            End If
        End Function
    End Class  

このコンペアラをフィールドディスクプリタに設定し、 UserSortableをALLOWにします。

    Dim rp As New UTable.CRecordProvider
    With New CLayoutBuilder
        rp.AddField("check", New CCheckFieldProvider("check"), .Next)
        rp.AddField("name", New CTextFieldProvider("name"), .Next).Comparer = New CSampleComparer
    End With
    Me.Table.Content.SetRecordProvider(rp)
    Me.Table.CreateCaption()
    Me.Table.Setting.UserSortable = UTable.ESortable.ALLOW    

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


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