条件フィルター
ConditionalDataFilter を使用すると、列ごとのルールを満たさない行を非表示にできます。フィルターはワークシートの範囲に紐付けた ColumnBasedDataSource に対して動作し、テキスト検索フィルターなど他のフィルターと組み合わせることもできます。
前提条件
- フィルタリングしたい列に名前を付けた
ColumnBasedDataSourceを範囲に設定する必要があります:sheet.AddDataSource(range, dataSource);データソースが設定されていない場合や列ベースでない場合、DoFilter呼び出し時に例外が発生します。 FilterCondition.ColumnIDにはColumnBasedDataSource.Columnsに存在する列名を指定してください。存在しない列名を指定した場合、BeginFilter実行時にColumnDefineNotFoundExceptionが発生します。- フィルタリングは対象行の高さを
0に設定することで行の非表示を実現します。フィルターを適用するには必ずWorksheet.DoFilter(range, filter)を呼び出してください。
ルールの作成と管理
ConditionalDataFilter.Conditions にアクティブなルールが保持されます。条件を追加・削除したり、FilterCondition.IsEnabled を切り替えることでフィルターを制御します。
using unvell.ReoGrid;
using unvell.ReoGrid.Data;
using unvell.ReoGrid.Data.ConditionFilter;
var sheet = grid.CurrentWorksheet;
var (ds, range) = BuildColumnDataSource(); // ColumnBasedDataSource と範囲を返す
sheet.AddDataSource(range, ds);
var filter = new ConditionalDataFilter
{
ErrorOnMismatchedType = false, // true にすると型不一致時に例外をスロー
};
filter.Conditions.AddRange(
new FilterCondition("price", ConditionOperator.GreaterThan, 1000),
new FilterCondition("currency", ConditionOperator.Equals, "USD", CellDataKind.Value, ComparisonType.Text),
new FilterCondition("tradeDate", ConditionOperator.Equals, "2024-05") // 年月レベルで一致
);
filter.OnApply += (s, e) => sheet.DoFilter(range, filter);
filter.Apply(); // ルールを評価して行を非表示にする
ルールの主な設定項目
- 演算子(
ConditionOperator):Equals(等しい)、NotEquals(等しくない)、StartsWith(前方一致)、EndsWith(後方一致)、Contains(含む)、NotContains(含まない)、GreaterThan(より大きい)、EqualsOrGreaterThan(以上)、LessThan(より小さい)、EqualsOrLessThan(以下)、Includes(配列内に含まれる) - 列の指定:
ColumnIDにデータソースの列名を指定します。ColumnIndexはBeginFilter実行時に自動的に設定されます。 - 値の解析(
ComparisonType):既定値のAutoは「数値 → 日時 → テキスト」の順に解析を試みます。- 数値解析:数値、文字列、
StringBuilder、"100%"形式のパーセント(0.0〜1.0の範囲)に対応します。 - 日時解析:
DateTime型および多くの文字列形式(yyyy/MM/dd、yyyyMMdd、yyyy-M、yyyy年M月d日、h:m[:s]およびDateTime.TryParseが解析できる形式)に対応します。 - 日付の等値比較では、書式から推測された
DateTimeValidPart(YYYY、YYYYMM、YYYYMMDD、HHMM、HHMMSSなど)が考慮されます。
- 数値解析:数値、文字列、
- 比較対象(
ComparisonDataKind):既定値のCellDataKind.Valueは生の値で比較します。CellDataKind.DisplayTextを指定すると表示テキストで比較します。日付列の表示文字列で絞り込みたい場合などにDisplayTextが有効です。 - 配列ルール:
ConditionOperator.Includesには任意のIEnumerableを指定できます。数値の配列に限定したい場合はComparisonType.Numericを指定します。 - null・空文字の扱い:等値チェック時は空文字と
nullが等しいものとして扱われます。
フィルターの単独使用と組み合わせ使用
ルールが変更されたタイミングで Worksheet.DoFilter(range, filter) を呼び出してください。よくあるパターンは、フィルターの OnApply イベントから呼び出す方法です。TextSearchDataFilter など他のフィルターと組み合わせる場合は MultipleDataFilter でラップします。
var condition = new ConditionalDataFilter();
var search = new TextSearchDataFilter();
var filters = new MultipleDataFilter();
filters.Filters.Add(condition);
filters.Filters.Add(search);
condition.OnApply += (s, e) => sheet.DoFilter(range, filters);
search.OnApply += (s, e) => sheet.DoFilter(range, filters);
条件の追加・削除、値の更新、IsEnabled の切り替えを行った後は、Apply() を呼び出して OnApply イベントを発火し、DoFilter を再実行してください。