MESCIUS SPREAD for Windows Forms 17.0J
カスタムグループ

グループ化が実行されたシートでは、グループ化されたデータを表す、専用のデータモデルを使用できます。このデータモデルは、階層構造ではない、フラットな構造をもち、グループヘッダのほか、グループ化に固有のデータが格納されています。このデータモデルの基底には、行のデータが格納された、シートのデータモデルが存在します。

以下、グループ化に関するメンバです。

メンバ 説明
IGroupSupport インタフェース グループ化への対応を表すインタフェース
GroupDataModel クラス グループ化したデータを表すクラス
Group クラス グループ化で生成される各グループを表すクラス
GroupingおよびGroupedイベント グループ化を実行、および実行完了したときに発生する、FpSpreadクラスのイベント
GroupInfo クラス グループヘッダの設定を表すクラス
GroupInfoCollection クラス GroupInfoオブジェクトのコレクションを表すクラス
グループデータモデルの使用

グループ化が実行されたシートでは、SheetViewクラスのModelsプロパティで参照するSheetView.DocumentModelsオブジェクトのDataプロパティで、グループ化したデータを表すGroupDataModelオブジェクトを参照できます。GroupDataModelクラスのIsGroupメソッドを使用すると、指定した行がグループヘッダかどうかを確認できます。また、GetGroupメソッドを使用すると、指定した行が所属するグループを表すGroupオブジェクトを参照できます。

サンプルコード

次のサンプルコードは、シートのGroupDataModelオブジェクトを参照し、各グループを参照します。

C#
コードのコピー
private void button1_Click(object sender, EventArgs e)
{
    if (fpSpread1.ActiveSheet.Models.Data is FarPoint.Win.Spread.Model.GroupDataModel)
    {
        FarPoint.Win.Spread.Model.GroupDataModel gdm = (FarPoint.Win.Spread.Model.GroupDataModel)fpSpread1.ActiveSheet.Models.Data;
        for (int i = 0; i < gdm.RowCount; i++)
        {
            //グループヘッダ行かどうかを確認
            if (gdm.IsGroup(i))
            {
                //グループを参照
                var g = gdm.GetGroup(i);
                //グループの基準となる列、グループに含まれる行数を取得
                Console.WriteLine(string.Format("列インデックス:{0}, 行数:{1}",g.Column, g.Rows.Count));                       
            }
        }
    }
}
Visual Basic
コードのコピー
Private Sub button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If TypeOf FpSpread1.ActiveSheet.Models.Data Is FarPoint.Win.Spread.Model.GroupDataModel Then
        Dim gdm As FarPoint.Win.Spread.Model.GroupDataModel = DirectCast(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.GroupDataModel)
        For i As Integer = 0 To gdm.RowCount - 1
            'グループヘッダ行かどうかを確認
            If gdm.IsGroup(i) Then
                'グループを参照
                Dim g = gdm.GetGroup(i)
                'グループの基準となる列、グループに含まれる行数を取得
                Console.WriteLine(String.Format("列インデックス:{0}, 行数:{1}", g.Column, g.Rows.Count))
            End If
        Next
    End If
End Sub
カスタムグループの作成

グループ化では、独自の比較オブジェクト(IComparerインタフェースの実装クラス)を作成し、設定できます。たとえば、年に関する情報を保持する列で、10年単位のカスタムグループを作成できます。独自の比較オブジェクトは、グループ化の実行で発生するFpSpreadクラスのGroupingイベントで、イベント引数に設定します。

サンプルコード

次のサンプルコードは、独自の比較オブジェクトを作成し、日付の値を10年単位の年を表す数値に変換して比較します。

C#
コードのコピー
[Serializable()]
public class MyGroupComparer : System.Collections.IComparer
{       
    public int Compare(object x1, object y1)
    {
        int x=0, y=0;
        if ((x1) is DateTime)
        {
            x = ((DateTime)(x1)).Year % 10;
            x = ((DateTime)(x1)).Year - x;
        }
        if ((y1) is DateTime)
        {
            y = ((DateTime)(y1)).Year % 10;
            y = ((DateTime)(y1)).Year - y;
        }
        if (x == y) return 0;
        else if (x > y) return 1;
        else return -1;
    }
}
//以下のコードはフォームのコードビハインドに記述する
private void Form1_Load(object sender, EventArgs e)
{
    //グループ化を有効に設定
    fpSpread1.AllowColumnMove = true;
    fpSpread1.ActiveSheet.GroupBarInfo.Visible = true;
    fpSpread1.ActiveSheet.AllowGroup = true;
    //テストデータを設定
    fpSpread1.ActiveSheet.SetValue(0, 0, DateTime.Today);
    fpSpread1.ActiveSheet.SetValue(1, 0, DateTime.Today.AddYears(1));
    fpSpread1.ActiveSheet.SetValue(2, 0, DateTime.Today.AddYears(11));
}
private void fpSpread1_Grouping(object sender, FarPoint.Win.Spread.GroupingEventArgs e)
{
    var colIndex = e.SortInfo.Last().Index;
    //1列目でカスタムグループを生成
    if (colIndex == 0)
    {
        e.GroupComparer = new MyGroupComparer();
    }
}
Visual Basic
コードのコピー
<Serializable>
Public Class MyGroupComparer
    Implements System.Collections.IComparer
    Public Function Compare(x1 As Object, y1 As Object) As Integer Implements IComparer.Compare
        Dim x As Integer = 0, y As Integer = 0
        If TypeOf (x1) Is DateTime Then
            x = DirectCast(x1, DateTime).Year Mod 10
            x = DirectCast(x1, DateTime).Year - x
        End If
        If TypeOf (y1) Is DateTime Then
            y = DirectCast(y1, DateTime).Year Mod 10
            y = DirectCast(y1, DateTime).Year - y
        End If
        If x = y Then
            Return 0
        ElseIf x > y Then
            Return 1
        Else
            Return -1
        End If
    End Function
End Class
'以下のコードはフォームのコードビハインドに記述する
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load      
    'グループ化を有効に設定
    FpSpread1.AllowColumnMove = True
    FpSpread1.ActiveSheet.GroupBarInfo.Visible = True
    FpSpread1.ActiveSheet.AllowGroup = True
    'テストデータを設定
    FpSpread1.ActiveSheet.SetValue(0, 0, DateTime.Today)
    FpSpread1.ActiveSheet.SetValue(1, 0, DateTime.Today.AddYears(1))
    FpSpread1.ActiveSheet.SetValue(2, 0, DateTime.Today.AddYears(11))
End Sub
Private Sub FpSpread1_Grouping(sender As Object, e As GroupingEventArgs) Handles FpSpread1.Grouping
    Dim colIndex = e.SortInfo.Last().Index
    '1列目でカスタムグループを生成
    If colIndex = 0 Then
        e.GroupComparer = New MyGroupComparer()
    End If
End Sub
参照

 

 


© MESCIUS inc. All rights reserved.