リレーショナルデータテーブルを利用して階層データ表示 (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
- 公開

