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 |