条件付きフィルター
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): 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 を使用します。サンプル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 を再実行します。
| メンバー | 型 | 説明 |
|---|
Conditions | ConditionCollection | フィルタールールのコレクション |
ErrorOnMismatchedType | bool | true の場合、比較中の型不一致で例外をスロー |
Apply() | void | ルールを評価(OnApply を発生) |
OnApply | event | DoFilter を呼び出すためのハンドラー |
| メソッド | 説明 |
|---|
Add(FilterCondition item) | ルールを追加 |
AddRange(params FilterCondition[] items) | 複数のルールを追加 |
Remove(FilterCondition item) | ルールを削除 |
Clear() | すべてのルールを削除 |
Contains(FilterCondition item) | ルールが存在するか確認 |
Count | ルールの数 |
| コンストラクタパラメータ | 型 | デフォルト | 説明 |
|---|
columnId | string | 必須 | データソースの列ID |
op | ConditionOperator | 必須 | 比較演算子 |
value | object | 必須 | 比較する値 |
comparisonDataKind | CellDataKind | Value | 生の値または表示テキストを比較 |
comparisonType | ComparisonType | Auto | 値の解析方法 |
| プロパティ | 型 | 説明 |
|---|
ColumnID | string | 列識別子 |
Operator | ConditionOperator | 比較演算子 |
Value | object | 比較値 |
IsEnabled | bool | このルールが有効かどうか |
ComparisonDataKind | CellDataKind | 生の値または表示テキストに対して比較 |
| 値 | 記号 | 説明 |
|---|
Equals | == | 等しい |
NotEquals | != | 等しくない |
StartsWith | ~* | で始まる |
EndsWith | *~ | で終わる |
Contains | ~ | を含む |
NotContains | !~ | を含まない |
GreaterThan | > | より大きい |
EqualsOrGreaterThan | >= | 以上 |
LessThan | < | より小さい |
EqualsOrLessThan | <= | 以下 |
Includes | IN | コレクションに含まれる |
| 値 | 説明 |
|---|
Auto | 自動的に型を検出(数値 → 日時 → テキスト) |
Numeric | 数値比較を強制 |
Text | テキスト比較を強制 |
DateTime | 日時比較を強制 |
| 値 | 説明 |
|---|
Value | 生のセル値に対して比較 |
DisplayText | 書式設定された表示テキストに対して比較 |
日付比較の粒度を制御します(値の形式から自動的に推論されます):
| 値 | 説明 |
|---|
YYYYMMDD_HHMMSS | 完全な日付と時刻 |
YYYY | 年のみ |
YYYYMM | 年と月 |
YYYYMMDD | 年、月、日 |
HH | 時のみ |
HHMM | 時と分 |
HHMMSS | 時、分、秒 |
YYYYMMDD_HHMM | 日付と時刻(秒なし) |