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