ReoGrid Version 4をリリースしました。多数の新機能に対応し、機能性・パフォーマンスの両面で大幅に強化されています。新機能の詳細については、こちらをご覧ください。
条件フィルター

条件フィルター

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 にデータソースの列名を指定します。ColumnIndexBeginFilter 実行時に自動的に設定されます。
  • 値の解析ComparisonType):既定値の Auto は「数値 → 日時 → テキスト」の順に解析を試みます。
    • 数値解析:数値、文字列、StringBuilder"100%" 形式のパーセント(0.0〜1.0 の範囲)に対応します。
    • 日時解析:DateTime 型および多くの文字列形式(yyyy/MM/ddyyyyMMddyyyy-Myyyy年M月d日h:m[:s] および DateTime.TryParse が解析できる形式)に対応します。
    • 日付の等値比較では、書式から推測された DateTimeValidPartYYYYYYYYMMYYYYMMDDHHMMHHMMSS など)が考慮されます。
  • 比較対象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 を再実行してください。


ページの内容は役に立ちましたか?