GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の最新情報をお届けします。製品のTIPSや発売情報、イベントのお知らせなどをいち早く発信中です。

SPREAD for WPF 2.0J 新機能紹介(6)- フィルタリングとソートの強化

2.0Jのフィルタリングは、条件フィルタと検索ボックスが追加されて、よりExcelライクに進化しています(詳しくは、こちらの記事をどうぞ)。 実は、フィルタリングには他にも強化された点があります。今日は以下、フィルタリングとソートの強化点のご紹介です:

固定行を除外したフィルタリングとソート

下図のように、先頭に見出し、末尾に集計行を固定し、シートを上下にスクロールしてもこれらの行が常に表示されるような一覧を作成する機会は少なくないかと思います。 20171031_1 このような一覧のフィルタリングやソートでは、固定された行を除外してほしいというご要望をこれまで多くいただいてきました。

2.0Jでは、フィルタリングとソートのそれぞれに、固定行を除外して実行するかどうかを設定するプロパティが追加されました。

Visual Basic
'先頭末尾行を固定
gcSpreadGrid1.FrozenRowCount = 1
gcSpreadGrid1.FrozenTrailingRowCount = 1

'固定行をソートから除外
gcSpreadGrid1.SortIgnoreFrozenRows = True
'固定行をフィルタリングから除外
gcSpreadGrid1.FilterIgnoreFrozenRows = True
C#
//先頭末尾行を固定
gcSpreadGrid1.FrozenRowCount = 1;
gcSpreadGrid1.FrozenTrailingRowCount = 1;

//固定行をソートから除外
gcSpreadGrid1.SortIgnoreFrozenRows = true;
//固定行をフィルタリングから除外
gcSpreadGrid1.FilterIgnoreFrozenRows = true;

以下、固定行を除外してソート、またフィルタリングした例です。先頭、および末尾の固定行を除いて処理が実行されます。

A列を降順でソート
20171031_6
B列を「〇」でフィルタリング ※フィルタリングメニュー(左図)には固定行を除いたデータのみが表示されます
20171031_7 20171031_2

フィルタリングイベントの追加

2.0Jでは、フィルタリングが実行されたときに発生するFilteredイベントが追加されました(新バージョンで追加されたイベントについては、こちらの記事もどうぞ)。

SPREADのフィルタリングは、以下の場合に実行されます。

  • ユーザー(またはコードから)フィルタリングが実行されたとき
  • フィルタリングされた状態で、フィルタリング対象のセルの値が変更されたとき
  • フィルタリングされた状態で、データソースの初期化など、データがリセットされたとき

イベント引数のActionプロパティで、フィルタリングが上記のいずれに該当するかを調べることができます。以下のサンプルコードでは、フィルタリングがa.に該当する場合、何列目でフィルタリングが実行されたかを調べます。

Visual Basic
Private Sub gcSpreadGrid1_Filtered(sender As Object, e As FilteredEventArgs)

    'Filteredイベントを発生させたアクションを取得
    If e.Action = FilterAction.FilterConditionChanged Then
        Console.WriteLine(String.Format("{0}列目でフィルタリングが実行されました", e.Column + 1))
    End If

End Sub
C#
private void gcSpreadGrid1_Filtered(object sender, FilteredEventArgs e)
{
    //Filteredイベントを発生させたアクションを取得
    if (e.Action == FilterAction.FilterConditionChanged)
    {
        Console.WriteLine(string.Format("{0}列目でフィルタリングが実行されました", e.Column + 1));
    }
}

非表示の行を除外した集計

最後にご紹介するのは、フィルタ処理された一覧で、非表示の値を集計から除外する方法です。 ExcelのSUBTOTAL関数と同様に、2.0JのSUBTOTAL関数は、非表示の値を集計から除外できるようになりました。非表示の値を集計に含めるかどうかは、SUBTOTAL関数に指定する関数コードで指定します。 以下、サンプルコードでは、関数コード「103」を指定し、非表示行を除外してCOUNTA関数による集計(空白を除くセル数をカウント)を行います。

Visual Basic
'集計行に数式を設定
Dim last As Integer = gcSpreadGrid1.RowCount - 1
gcSpreadGrid1.SetCellValue(last, 0, "表示件数")
gcSpreadGrid1.SetFormula(last, 1, "SUBTOTAL(103, B2:B99)")
C#
//集計行に数式を設定
int last = gcSpreadGrid1.RowCount - 1;
gcSpreadGrid1.SetCellValue(last, 0, "表示件数");
gcSpreadGrid1.SetFormula(last, 1, "SUBTOTAL(103, B2:B99)");

なお、ここまでご紹介してきた一覧ですが、同様の一覧をグループ集計を使用して作成することもできます。グループ集計を使用することで、見出しはグループヘッダ、集計行はグループフッタとして表示できます。 以下、グループ集計を使用した一覧の様子です。 20171031_5 一見、最初の一覧と変わりませんが、実は、集計行の行番号が「102」である点が異なります。これは、グループ化によりグループヘッダとフッタの2行が一覧に追加されたからです。

先ほどの一覧では、集計にSUBTOTAL関数を使用しましたが、グループフッタの集計機能を使用すれば、セルのAggregationTypeプロパティを指定することで同様の処理が可能です。

SUBTOTAL(103,...と同様の集計は、AggregationTypeプロパティにCountAExcludeHiddenRowsを指定することで実現できます。この辺り2.0Jは抜かりなく、AggregationType列挙体に~ExcludeHiddenRowsという名称のメンバ(非表示セルを除外する集計タイプ)が11種類、追加されています。

Visual Basic
'グループ化を設定
gcSpreadGrid1.GroupDescriptions.Add(New SpreadGroupDescription() With {.ColumnIndex = 2})
gcSpreadGrid1.Columns(2).GroupHeader(0, 0).Value = "日付"
gcSpreadGrid1.Columns(2).GroupHeader(0, 1).Value = "出欠"
gcSpreadGrid1.Columns(2).GroupFooter(0, 0).Value = "表示件数"
'グループ集計を設定
gcSpreadGrid1.Columns(2).GroupFooter(0, 1).AggregationType = AggregationType.CountAExcludeHiddenRows
c#
//グループ化を設定
gcSpreadGrid1.GroupDescriptions.Add(new SpreadGroupDescription() { ColumnIndex = 2 });
gcSpreadGrid1.Columns[2].GroupHeader[0, 0].Value = "日付";
gcSpreadGrid1.Columns[2].GroupHeader[0, 1].Value = "出欠";
gcSpreadGrid1.Columns[2].GroupFooter[0, 0].Value = "表示件数";
//グループ集計を設定
gcSpreadGrid1.Columns[2].GroupFooter[0, 1].AggregationType = AggregationType.CountAExcludeHiddenRows;

以上、フィルタリングとソートの強化点をご紹介しました。機会があれば、ぜひご活用ください!

Copyright © GrapeCity, Inc. All Rights Reserved.