フィルタ処理、ソート処理を実装した一覧表をWPFで作成する
最強の表計算・グリッドコントロールとして多くの開発現場で採用されてきたSPREAD(スプレッド)。この記事ではWPFプラットフォームに対応した「SPREAD for WPF 2.0J」の機能を紹介します。
SPREAD for WPFフィルタリングは、条件フィルタと検索ボックスなどExcelライクの操作性を提供しています。
他にもフィルタリングは豊富な機能を提供しているので、データ一覧表などデータグリッド表示に活用できます。
固定行を除外したフィルタリングとソート
下図のように、先頭に見出し、末尾に集計行を固定し、シートを上下にスクロールしてもこれらの行が常に表示されるような一覧の場合、固定された行をフィルタリングやソートの対象にする、しないをプロパティで指定できます。
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列を降順でソート
B列を「〇」でフィルタリング
フィルタリングメニューには固定行を除いたデータのみが表示されます。
フィルタリング実行結果
フィルタリングイベントの追加
フィルタリングが実行されたとき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関数と同様に、SPREAD for WPFの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)");
なお、ここまでご紹介してきた一覧ですが、同様の一覧をグループ集計を使用して作成することもできます。グループ集計を使用することで、見出しはグループヘッダ、集計行はグループフッタとして表示できます。
以下はグループ集計を使用した状態です。
一見、最初の一覧と変わりませんが、集計行の行番号が「102」である点が異なります。
これは、グループ化によりグループヘッダとフッタの2行が一覧に追加されたためです。
前述の一覧では、集計にSUBTOTAL関数を使用しましたが、セルのAggregationType
プロパティを指定し、グループフッタの集計機能を使用することでも同様の処理が可能です。
SUBTOTAL(103,…と同様の集計は、AggregationType
プロパティにCountAExcludeHiddenRows
を指定することで実現できます。
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;
SPREAD for WPFの機能を体感
.NET FrameworkのClick Once機能を利用したデモを公開しています。
Windows PCにWebサイトからインストールして、SPREAD for WPFの機能を実際にお試しいただけます。