リレーショナルデータテーブルを利用して階層データ表示 (TrueDBGrid)

サンプル画面

階層データ表示 (TrueDBGrid)

これらのグリッドは、すべてDataSet内にリレーションデータテーブルを作成し表示しています。
[c1TrueDBGrid1]では、通常の階層データ表示を行っています。レコードの左端の展開アイコン( + )が、階層化データがあることを示しています。
[c1TrueDBGrid2]では、ChildGridプロパティに子グリッドとして[c1TrueDBGrid3]を設定し、ドロップダウンで子データを表示しています。
[c1TrueDBGrid4]は、グループ化の表示例です。

特定のセルを編集不可にする

この場合、編集モードに入る直前に発生するBeforeColEditイベントを利用し、Cancel引数をTrueにします。Cancel引数をTrueにすると編集モードへ移行せず、編集出来なくなります。
下の例では1行目の得意先コード列を編集不可にしています。

 Public Class frmGrid4

    Private ds As DataSet = Nothing

    ''' 
    ''' サンプルデータ作成
    ''' 
    ''' 
    Private Sub initializeData()

        Dim i As Integer
        Dim j As Integer

        ' Random クラスの新しいインスタンスを生成する
        Dim cRandom As New System.Random()

        Dim dtHead As New DataTable("HEADER")       '親データテーブル
        Dim dtDetail As New DataTable("DETAIL")     '子データテーブル
        Dim drow As DataRow
        
        ds = New DataSet

        '親データテーブルの定義
        dtHead.Columns.Add("No", GetType(Integer))
        dtHead.Columns.Add("得意先コード", GetType(Integer))
        dtHead.Columns.Add("得意先名", GetType(String))

        '子データテーブルの定義
        dtDetail.Columns.Add("得意先コード", GetType(Integer))
        dtDetail.Columns.Add("品名", GetType(String))
        dtDetail.Columns.Add("出荷数", GetType(Decimal))


        For i = 1 To 100
            '親データの作成
            drow = dtHead.NewRow
            drow(0) = i
            drow(1) = i + 1000
            drow(2) = "得意先 " & Format(CInt(drow(1)), "0000")
            dtHead.Rows.Add(drow)

            '子データの作成
            For j = 0 To 9
                drow = dtDetail.NewRow
                drow(0) = i + 1000
                drow(1) = "商品" & cRandom.Next(10).ToString
                drow(2) = cRandom.Next(100)
                dtDetail.Rows.Add(drow)
            Next
        Next

        ds.Tables.Add(dtHead)
        ds.Tables.Add(dtDetail)

        'リレーションの定義
        ds.Relations.Add( _
            New DataRelation( _
                "Tokui_Details", _
                ds.Tables("HEADER").Columns("得意先コード"), _
                ds.Tables("DETAIL").Columns("得意先コード") _
            ) _
        )

        'TrueDBGridにバインド
        C1TrueDBGrid1.DataSource = ds
        C1TrueDBGrid1.DataMember = "HEADER"
        C1TrueDBGrid2.DataSource = ds
        C1TrueDBGrid2.DataMember = "HEADER"
        C1TrueDBGrid3.DataSource = ds
        C1TrueDBGrid3.DataMember = "HEADER.Tokui_Details"
        '子グリッドを親グリッドに関連付ける
        C1TrueDBGrid2.ChildGrid = C1TrueDBGrid3
        C1TrueDBGrid4.DataSource = ds
        C1TrueDBGrid4.DataMember = "DETAIL"

    End Sub

    ''' 
    ''' TrueDBGridの初期設定
    ''' 
    ''' 
    Private Sub initializeGrid()

        With C1TrueDBGrid1
            .RowHeight = 18
            .AlternatingRows = True
            .EvenRowStyle.BackColor = Color.AliceBlue
            .DataView = C1.Win.C1TrueDBGrid.DataViewEnum.Hierarchical
        End With

        With C1TrueDBGrid2
            .RowHeight = 18
            .AlternatingRows = True
            .EvenRowStyle.BackColor = Color.AliceBlue
        End With

        With C1TrueDBGrid3
            .RowHeight = 18
            .AlternatingRows = True
            .EvenRowStyle.BackColor = Color.AliceBlue
        End With

        With C1TrueDBGrid4
            .RowHeight = 18
            .AlternatingRows = True
            .EvenRowStyle.BackColor = Color.AliceBlue
            .DataView = C1.Win.C1TrueDBGrid.DataViewEnum.GroupBy
            .RecordSelectors = False
            .AllowColSelect = False
        End With

    End Sub

    Private Sub frmGrid4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        initializeGrid()
        initializeData()
    End Sub
End Class

ソース説明

プロシジャ[initializeData]

サンプルデータを作成し、Gridにデータバインドしています。
(70行目) c1TrueDBGrid2の子グリッドであるc1TrueDBGrid3のDataMemberプロパティに何を設定するかがはじめよくわかりませんでした。
結果的にリレーションの親データを設定すればOKでしたが、テーブル名.リレーション名 という書き方がわからずちょっと時間を取られました。

C1TrueDBGrid3.DataMember = "HEADER.Tokui_Details"

プロシジャ[initializeGrid]

(88行目) グリッドを階層表示に切り替えています。 DataView プロパティを DataViewEnum.Hierarchical に設定すると、グリッドに上のデータセットがバンド構造で表示されます。

※TrueDBGridのヘルプには、「DataView プロパティは設計時に設定する必要があります。実行時には変更できません。」とあります。
今回実行時に変更しているのですが、何ら問題はありません。微妙な表現ですが、これの意味するところは、一度設定したらその後変更出来ない、と言う事なんでしょうか?

(107行目) グリッドの表示を GroupBy に切り替えています。

 

履歴

2011/11/15
公開
Loading