PowerTools SPREAD for Windows Forms 10.0J > 開発者ガイド > データ連結 > 階層表示 |
リレーショナルデータベースのデータなど、データのリレーションを、シートの階層で表示できます。 次の図は、このような階層表示の例を示します。 ユーザーは階層の展開アイコン(+記号)と折りたたみアイコン(-記号)をクリックすることで、階層の各レベルを展開または折りたたみできます。
|
階層表示を設定するには、最初に、リレーショナルデータを保持するデータセットを作成します。次に、データ間の関係を定義してから、データが適切に表示されるようにコントロールを設定します。
データセットを作成し、リレーション(リレーショナルデータベースのテーブル間の関係)を設定します。FpSpreadクラス、またはSheetViewクラスのDataSourceプロパティに、このデータセットを設定します。
次のサンプルコードは、リレーショナルデータを作成し、コントロールに連結します。
C# |
コードのコピー
|
---|---|
public class Score { private string classname; private string grade; public string ClassName { get { return classname; } set { classname = value; } } public string Grade { get { return grade; } set { grade = value; } } } public class Student { private string name; private string id; private ArrayList score = new ArrayList(); public string Name { get { return name; } set { name = value; } } public string Id { get { return id; } set { id = value; } } public ArrayList Score { get { return score; } } } private void Form1_Load(object sender, System.EventArgs e) { ArrayList list = new ArrayList(); Student s = new Student(); s.Name = "John Smith"; s.Id = "100001"; Score sc = new Score(); sc.ClassName = "math"; sc.Grade = "A"; s.Score.Add(sc); sc = new Score(); sc.ClassName = "English"; sc.Grade = "A"; s.Score.Add(sc); list.Add(s); s = new Student(); s.Name = "David Black"; s.Id = "100002"; sc = new Score(); sc.ClassName = "math"; sc.Grade = "B"; s.Score.Add(sc); sc = new Score(); sc.ClassName = "English"; sc.Grade = "A"; s.Score.Add(sc); list.Add(s); fpSpread1_Sheet1.DataSource = list; } |
Visual Basic |
コードのコピー
|
---|---|
Public Class Score Private classn as String Private grade As String Public Property ClassName() As String Get Return classn End Get Set(ByVal Value As String) classn = Value End Set End Property Public Property Grades() As String Get Return grade End Get Set(ByVal Value As String) grade = Value End Set End Property End Class Public Class student Private name As String Private id As String Private sco As ArrayList = New ArrayList() Public Property names() As String Get Return name End Get Set(ByVal Value As String) name = Value End Set End Property Public Property ids() As String Get Return id End Get Set(ByVal Value As String) id = Value End Set End Property Public ReadOnly Property score() As ArrayList Get Return sco End Get End Property End Class Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim list As ArrayList = New ArrayList() Dim s As student = New student() s.names = "John Smith" s.ids = "100001" Dim sc As Score = New Score() sc.ClassName = "math" sc.Grades = "A" s.Score.Add(sc) sc = New Score() sc.ClassName = "English" sc.Grades = "A" s.Score.Add(sc) list.Add(s) s = New student() s.names = "David Black" s.ids = "100002" sc = New Score() sc.ClassName = "math" sc.Grades = "B" s.Score.Add(sc) sc = New Score() sc.ClassName = "English" sc.Grades = "A" s.Score.Add(sc) list.Add(s) FpSpread1_Sheet1.DataSource = list End Sub |
子階層の表示は、セル型、色、ヘッダなど、さまざまな属性をカスタマイズできます。
コントロールは、階層表示を子ビューと、子ビューすべての親シートとして扱います。 子ビューについての情報を取得するには、以下のプロパティやメソッドを使用します。
メンバ | 説明 |
---|---|
SheetViewクラスのChildRelationCountプロパティ | シートの子リレーションの数(データリレーション数)を取得します。 |
IChildModelSupportインタフェースのGetChildDataModelメソッド | 指定した行とデータリレーションの子データモデルを取得します。 |
SheetViewクラスのGetChildRelationメソッド | 指定したインデックスにある子データリレーションの名前を取得します。 |
SheetViewクラスのGetChildSheetsメソッド | 作成された子シートビューのリストを取得します。 |
SheetViewクラスのGetChildViewメソッド | 行とリレーションインデックスを指定して、シートを取得します。 |
SheetViewクラスのGetChildVisibleメソッド | 親行を展開したときに、このシートに子ビューを表示するかどうかを取得します。 |
SheetViewクラスのParentRelationNameプロパティ | シートのデータリレーション名を取得します。 |
エンドユーザーが子ビューを展開または折りたたんだタイミングを監視できます。 詳細については、FpSpreadクラスのExpandイベントおよびChildViewCreatedイベントを参照してください。 行を展開可能にするかどうかを設定するには、SheetViewクラスのGetRowExpandableおよびSetRowExpandableメソッドを使用し、行が現在展開されているかどうかを確認するには、SheetViewクラスのIsRowExpandedメソッドを使用します。
子ビューを表すSpreadViewクラスの各プロパティを設定する場合、このコードを挿入する最適な場所はFpSpreadクラスのChildWorkbookCreatedイベントです。このイベントは、子ビューが作成されたときに発生します。子階層のシートが作成されたときに、FpSpreadクラスのChildViewCreatedイベントが発生しますが、子ビューが作成されるのはこの後で、子階層のシートがコントロールで表示可能にならないかぎり作成されません(レイアウト計算のほうが早く行われる)。
データセットを作成し、リレーション(リレーショナル データベースのテーブル間の関係)を設定します。FpSpreadクラス、またはSheetViewクラスのDataSourceプロパティに、このデータセットを設定します。FpSpreadクラスのChildViewCreatedイベントに、データの親子関係を表示するためのコードを追加します。
次のサンプルコードは、FpSpreadクラスのChildViewCreatedイベントを使用してデータの親子関係を表示する例です。
C# |
コードのコピー
|
---|---|
private void Form1_Load(object sender, EventArgs e) { // データを設定し、SPREADコンポーネントをフォーマットするためのサブルーチンを呼び出します。 InitData(); FormatSpread(); } private void InitData() { System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(); System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(); System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(); System.Data.DataSet ds = new System.Data.DataSet(); con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Access\\databind.mdb\""; con.Open(); cmd.Connection = con; cmd.CommandType = System.Data.CommandType.TableDirect; cmd.CommandText = "Categories"; da.SelectCommand = cmd; da.Fill(ds, "Categories"); cmd.CommandText = "Products"; da.SelectCommand = cmd; da.Fill(ds, "Products"); cmd.CommandText = "Inventory Transactions"; da.SelectCommand = cmd; da.Fill(ds, "Inventory Transactions"); ds.Relations.Add("Root", ds.Tables["Categories"].Columns["CategoryID"], ds.Tables["Products"].Columns["CategoryID"]); ds.Relations.Add("Secondary", ds.Tables["Products"].Columns["ProductID"], ds.Tables["Inventory Transactions"].Columns["TransactionID"]); fpSpread1.DataSource = ds; } private void FormatSpread() { SheetView sheet = fpSpread1.Sheets[0]; sheet.ColumnHeader.Rows[0].Height = 30; sheet.Columns[0].Visible = false; } private void fpSpread1_ChildViewCreated(object sender, ChildViewCreatedEventArgs e) { FarPoint.Win.Spread.CellType.DateTimeCellType dateType = new FarPoint.Win.Spread.CellType.DateTimeCellType(); if (e.SheetView.ParentRelationName == "Root") { var sheet = e.SheetView; sheet.DataAutoCellTypes = false; sheet.DataAutoSizeColumns = false; sheet.ColumnHeader.Rows[0].Height = 30; sheet.Columns[0].Visible = false; sheet.Columns[3].Visible = false; sheet.Columns[4].Visible = false; sheet.Columns[1].Width = 200; sheet.Columns[2].Width = 185; sheet.Columns[6].Width = 85; sheet.Columns[7].Width = 80; sheet.Columns[8].Width = 80; sheet.Columns[5].CellType = new FarPoint.Win.Spread.CellType.CurrencyCellType(); sheet.Columns[7].CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType(); } else { var sheet = e.SheetView; sheet.DataAutoCellTypes = false; sheet.DataAutoSizeColumns = false; sheet.ColumnHeader.Rows[0].Height = 30; sheet.Columns[0].Visible = false; sheet.Columns[2].Visible = false; sheet.Columns[3].Visible = false; sheet.Columns[4].Visible = false; sheet.Columns[7].Visible = false; sheet.Columns[8].Visible = false; sheet.Columns[9].Visible = false; sheet.Columns[1].Width = 100; sheet.Columns[6].Width = 80; sheet.Columns[5].CellType = new FarPoint.Win.Spread.CellType.CurrencyCellType(); dateType.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.ShortDate; sheet.Columns[1].CellType = dateType; //合計列を追加します。 sheet.ColumnCount = sheet.ColumnCount + 1; sheet.ColumnHeader.Cells[0, sheet.ColumnCount - 1].Value = "Total"; sheet.Columns[sheet.ColumnCount - 1].CellType = new FarPoint.Win.Spread.CellType.CurrencyCellType(); sheet.Columns[sheet.ColumnCount - 1].Formula = "F1*G1"; } } |
Visual Basic |
コードのコピー
|
---|---|
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' データを設定し、SPREADコンポーネントをフォーマットするためのサブルーチンを呼び出します。 InitData() FormatSpread() End Sub Private Sub InitData() Dim con As New OleDb.OleDbConnection() Dim cmd As New OleDb.OleDbCommand() Dim da As New OleDb.OleDbDataAdapter() Dim ds As New DataSet() Dim dt As DataTable con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\Access\databind.mdb"" con.Open() With cmd .Connection = con .CommandType = CommandType.TableDirect .CommandText = "Categories" End With da.SelectCommand = cmd da.Fill(ds, "Categories") cmd.CommandText = "Products" da.SelectCommand = cmd da.Fill(ds, "Products") cmd.CommandText = "Inventory Transactions" da.SelectCommand = cmd da.Fill(ds, "Inventory Transactions") ds.Relations.Add("Root", ds.Tables("Categories").Columns("CategoryID"), ds.Tables("Products").Columns("CategoryID")) ds.Relations.Add("Secondary", ds.Tables("Products").Columns("ProductID"), ds.Tables("Inventory Transactions").Columns("TransactionID")) FpSpread1.DataSource = ds End Sub Private Sub FormatSpread() With FpSpread1.Sheets(0) .ColumnHeader.Rows(0).Height = 30 .Columns(0).Visible = False End With End Sub Private Sub FpSpread1_ChildViewCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildViewCreatedEventArgs) Handles FpSpread1.ChildViewCreated Dim dateType As New FarPoint.Win.Spread.CellType.DateTimeCellType() If e.SheetView.ParentRelationName = "Root" Then With e.SheetView .DataAutoCellTypes = False .DataAutoSizeColumns = False .ColumnHeader.Rows(0).Height = 30 .Columns(0).Visible = False .Columns(3).Visible = False .Columns(4).Visible = False .Columns(1).Width = 200 .Columns(2).Width = 185 .Columns(6).Width = 85 .Columns(7).Width = 80 .Columns(8).Width = 80 .Columns(5).CellType = New FarPoint.Win.Spread.CellType.CurrencyCellType() .Columns(7).CellType = New FarPoint.Win.Spread.CellType.CheckBoxCellType() End With Else With e.SheetView .DataAutoCellTypes = False .DataAutoSizeColumns = False .ColumnHeader.Rows(0).Height = 30 .Columns(0).Visible = False .Columns(2).Visible = False .Columns(3).Visible = False .Columns(4).Visible = False .Columns(7).Visible = False .Columns(8).Visible = False .Columns(9).Visible = False .Columns(1).Width = 100 .Columns(6).Width = 80 .Columns(5).CellType = New FarPoint.Win.Spread.CellType.CurrencyCellType() dateType.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.ShortDate .Columns(1).CellType = dateType '合計列を追加します。 .ColumnCount = .ColumnCount + 1 .ColumnHeader.Cells(0, .ColumnCount - 1).Value = "Total" .Columns(.ColumnCount - 1).CellType = New FarPoint.Win.Spread.CellType.CurrencyCellType() .Columns(.ColumnCount - 1).Formula = "F1*G1" End With End If End Sub |
連結データを扱う場合、親シートから子シートを削除するのではなく、データソース内のリレーションを削除することでコントロールから子シートを削除できます。
次のサンプルコードは、取得した最初の子シートを削除します。
C# |
コードのコピー
|
---|---|
ArrayList alist = fpSpread1.Sheets[0].GetChildSheets(); FarPoint.Win.Spread.SheetView sv = alist(0); DataSet ds = (DataSet)fpSpread1.DataSource; ds.Relations.Remove(sv.ParentRelationName); |
Visual Basic |
コードのコピー
|
---|---|
Dim alist As ArrayList = FpSpread1.Sheets(0).GetChildSheets() Dim sv As FarPoint.Win.Spread.SheetView = alist(0) Dim ds As DataSet = CType(FpSpread1.DataSource, DataSet) ds.Relations.Remove(sv.ParentRelationName) |