PowerTools SPREAD for Windows Forms 10.0J
階層表示

リレーショナルデータベースのデータなど、データのリレーションを、シートの階層で表示できます。 次の図は、このような階層表示の例を示します。 ユーザーは階層の展開アイコン(+記号)と折りたたみアイコン(-記号)をクリックすることで、階層の各レベルを展開または折りたたみできます。

階層を表示するSPREADコントロール

階層表示の設定

階層表示を設定するには、最初に、リレーショナルデータを保持するデータセットを作成します。次に、データ間の関係を定義してから、データが適切に表示されるようにコントロールを設定します。

設定方法

データセットを作成し、リレーション(リレーショナルデータベースのテーブル間の関係)を設定します。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)
関連トピック

 

 


© 2004-2017, GrapeCity inc. All rights reserved.