条件付きフィルター

条件付きフィルター

ConditionalDataFilter を使用して、列ルールのセットを満たさない値を持つ行を非表示にします。フィルターはワークシート範囲にアタッチされた ColumnBasedDataSource に対して動作し、他の行フィルター(例:フリーテキスト検索)と組み合わせることができます。

前提条件

  • フィルタリングしたい各列に名前を付けた ColumnBasedDataSource をアタッチしてください: sheet.AddDataSource(range, dataSource); 範囲にデータソースがないか、データソースが列ベースでない場合、Worksheet.DoFilter は例外をスローします。
  • FilterCondition.ColumnID の列IDは 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();     // returns ColumnBasedDataSource + its range
sheet.AddDataSource(range, ds);

var filter = new ConditionalDataFilter
{
    ErrorOnMismatchedType = false,             // throw on numeric/type mismatch if 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") // month‑level match
);

filter.OnApply += (s, e) => sheet.DoFilter(range, filter);
filter.Apply();                                // evaluates rules and hides rows

主要なルール設定

  • 演算子 (ConditionOperator): EqualsNotEqualsStartsWithEndsWithContainsNotContainsGreaterThanEqualsOrGreaterThanLessThanEqualsOrLessThanIncludes(配列メンバーシップ)。
  • : ColumnID はデータソースの列名と一致する必要があります。ColumnIndexBeginFilter 中に自動的に割り当てられます。
  • 値の解析 (ComparisonType): デフォルトの Auto は数値 → 日時 → テキストの順で試行します。
    • 数値解析は、数値、文字列、StringBuilder、および "100%" のようなパーセンテージ(0.0~1.0 の範囲)を受け付けます。
    • 日時解析は、DateTime 値と多くの文字列形式(yyyy/MM/ddyyyyMMddyyyy-Myyyy年M月d日h:m[:s]、および一般的な DateTime.TryParse)を受け付けます。
    • 日付の等価比較は、形式から推論される DateTimeValidPart(例:YYYYYYYYMMYYYYMMDDHHMMHHMMSS)を尊重します。
  • 比較対象 (ComparisonDataKind): 生の値を比較するには CellDataKind.Value(デフォルト)を、書式設定されたテキストを比較するには CellDataKind.DisplayText を使用します。サンプルUIは、レンダリングされた文字列と一致させる場合に日付列を DisplayText に切り替えます。
  • 配列ルール: ConditionOperator.Includes は任意の IEnumerable を受け付けます。数値メンバーを要求するには ComparisonType.Numeric を設定します。
  • Null/空の処理: 空文字列と null は等価チェック中に等しいものとして扱われます。

単独または組み合わせでフィルターを適用

ルールが変更されたときに Worksheet.DoFilter(range, filter) を呼び出します。一般的なパターンは、UIの変更が再適用をトリガーするように、フィルターの 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 を再実行します。

APIリファレンス

ConditionalDataFilter

メンバー説明
ConditionsConditionCollectionフィルタールールのコレクション
ErrorOnMismatchedTypebooltrue の場合、比較中の型不一致で例外をスロー
Apply()voidルールを評価(OnApply を発生)
OnApplyeventDoFilter を呼び出すためのハンドラー

ConditionCollection

メソッド説明
Add(FilterCondition item)ルールを追加
AddRange(params FilterCondition[] items)複数のルールを追加
Remove(FilterCondition item)ルールを削除
Clear()すべてのルールを削除
Contains(FilterCondition item)ルールが存在するか確認
Countルールの数

FilterCondition

コンストラクタパラメータデフォルト説明
columnIdstring必須データソースの列ID
opConditionOperator必須比較演算子
valueobject必須比較する値
comparisonDataKindCellDataKindValue生の値または表示テキストを比較
comparisonTypeComparisonTypeAuto値の解析方法
プロパティ説明
ColumnIDstring列識別子
OperatorConditionOperator比較演算子
Valueobject比較値
IsEnabledboolこのルールが有効かどうか
ComparisonDataKindCellDataKind生の値または表示テキストに対して比較

ConditionOperator列挙型

記号説明
Equals==等しい
NotEquals!=等しくない
StartsWith~*で始まる
EndsWith*~で終わる
Contains~を含む
NotContains!~を含まない
GreaterThan>より大きい
EqualsOrGreaterThan>=以上
LessThan<より小さい
EqualsOrLessThan<=以下
IncludesINコレクションに含まれる

ComparisonType列挙型

説明
Auto自動的に型を検出(数値 → 日時 → テキスト)
Numeric数値比較を強制
Textテキスト比較を強制
DateTime日時比較を強制

CellDataKind列挙型

説明
Value生のセル値に対して比較
DisplayText書式設定された表示テキストに対して比較

DateTimeValidPart列挙型

日付比較の粒度を制御します(値の形式から自動的に推論されます):

説明
YYYYMMDD_HHMMSS完全な日付と時刻
YYYY年のみ
YYYYMM年と月
YYYYMMDD年、月、日
HH時のみ
HHMM時と分
HHMMSS時、分、秒
YYYYMMDD_HHMM日付と時刻(秒なし)

関連トピック


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