データフィルタリング
ReoGridはデータ範囲に対してフィルターを実行して行を非表示にします。組み込みの列フィルターUI、ルールベースの条件付きフィルター、または任意のGUIに接続した独自のフィルターロジックを使用できます。
フィルターのエントリポイント
- オートフィルターUI – 列ごとにユニークな値を収集するExcelスタイルのドロップダウンです。組み込みオートフィルターを参照してください。
- 条件付きフィルター –
ColumnBasedDataSourceに対して評価されるルールオブジェクト(ConditionalDataFilter+FilterCondition)です。条件付きフィルターを参照してください。 - カスタムフィルター –
RowBasedDataFilter<IRowDataRecord>を実装するか(またはFunc<int, bool>を使用して)、Worksheet.DoFilter(range, filter)を自分で呼び出します。
最小限の例
述語の使用
var sheet = grid.CurrentWorksheet;
var range = sheet.UsedRange;
sheet.DoFilter(range, rowIndex =>
{
var value = sheet[rowIndex, 2]; // third column
return value is double d && d >= 1000; // keep rows with value >= 1000
});
データフィルターの使用
var condition = new ConditionalDataFilter();
condition.Conditions.Add(new FilterCondition("price", ConditionOperator.GreaterThan, 1000));
condition.OnApply += (s, e) => sheet.DoFilter("A1:D200", condition);
condition.Apply(); // triggers DoFilter
フィルターの組み合わせ
複数のフィルターを同時に適用したい場合(例えば、条件付きルールとフリーテキスト検索の組み合わせ)、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("A1:F300", filters);
search.OnApply += (s, e) => sheet.DoFilter("A1:F300", filters);
画面上フィルタリングとデータ駆動フィルタリング
- 画面上フィルター(UI駆動): 組み込みのオートフィルターと条件付きフィルターは、シート上に既に存在する行を非表示にします。ワークシートに現在読み込まれている範囲に対して動作します。
- データ駆動フィルター: データソースがフィルタリング/クエリをサポートしている場合、まずそこでフィルタリングし(例:データベースクエリ、メモリ内LINQ)、フィルタリング済みの
ColumnBasedDataSourceをシートにバインドします。ReoGridはフィルタリングされたレコードのみを表示し、追加の画面上フィルターはその上に適用されます。
独自のフィルターUIの構築
- コントロール(パネル、リスト、チェックボックスなど)を好きな場所にレンダリングします。多くの場合、ヘッダーのドロップダウン内に配置します。
- ユーザーが選択を変更したら、フィルターオブジェクトを更新して
Apply()を呼び出し、OnApplyでWorksheet.DoFilter(range, filter)を呼び出します。 - ヘッダーのドロップダウンの場合、
DropdownHeaderCellを派生させてコントロールをドロップダウンコンテンツとしてアタッチし、列ヘッダーにヘッダーボディをインストールします。
ワークシートフィルターメソッド
CreateColumnFilterのオーバーロード
| シグネチャ | 説明 |
|---|---|
CreateColumnFilter() | 使用範囲を自動検出してフィルターを作成 |
CreateColumnFilter(RangePosition range, AutoColumnFilterUI ui) | 範囲にフィルターを作成 |
CreateColumnFilter(string startCol, string endCol, int titleRows, AutoColumnFilterUI ui) | 列コードで作成 |
CreateColumnFilter(int column, int titleRows, AutoColumnFilterUI ui) | 単一列に作成 |
CreateColumnFilter(int startCol, int endCol, int titleRows, AutoColumnFilterUI ui) | 列インデックスで作成 |
DoFilterのオーバーロード
| シグネチャ | 説明 |
|---|---|
DoFilter(RangePosition range, Func<int, bool> filter) | 述語を使用してフィルタリング(行インデックス → 保持するか?) |
DoFilter(string addressOrRange, RowBasedDataFilter<IRowDataRecord> filter) | アドレスでデータフィルターを使用してフィルタリング |
DoFilter(RangePosition range, RowBasedDataFilter<IRowDataRecord> filter) | 範囲でデータフィルターを使用してフィルタリング |
SortColumn
| シグネチャ | 説明 |
|---|---|
SortColumn(string columnCode, SortOrder order) | 列アドレスコードでソート |
SortColumn(int columnIndex, RangePosition applyRange, SortOrder order) | 特定の範囲内でソート |
SortOrder列挙型
| 値 | 説明 |
|---|---|
Ascending | A→Z / 小さい順にソート |
Descending | Z→A / 大きい順にソート |
イベント
| イベント | 説明 |
|---|---|
RowsFiltered | ワークシートで行がフィルタリングされた後に発生 |
sheet.RowsFiltered += (s, e) =>
{
Console.WriteLine("Rows have been filtered");
};
フィルタークラス
RowBasedDataFilter<T>(抽象基底クラス)
| メンバー | 型 | 説明 |
|---|---|---|
InputSource | IDataSource<T> | フィルタリング対象のデータソース |
IsDisabled | bool | フィルターの有効/無効を切り替え |
Apply() | void | フィルターを適用(OnApply を発生) |
OnApply | event | フィルターが適用されたときに発生 |
BeginFilter(Worksheet, ColumnBasedDataSource) | abstract | フィルタリング開始前に呼び出される |
FilterRecord(T record) | abstract bool | 行を保持する場合は true を返す |
EndFilter() | abstract | フィルタリング終了後に呼び出される |
TextSearchDataFilter
検索文字列を含む行をフィルタリングします(大文字小文字を区別しない、全列を検索)。
| プロパティ | 型 | 説明 |
|---|---|---|
Text | string | 検索するテキスト |
var search = new TextSearchDataFilter();
search.Text = "hello";
search.OnApply += (s, e) => sheet.DoFilter(range, search);
search.Apply();
MultipleDataFilter
複数のフィルターを結合します。行が表示されるには、すべてのサブフィルターを通過する必要があります。
| プロパティ | 型 | 説明 |
|---|---|---|
Filters | List<RowBasedDataFilter<IRowDataRecord>> | サブフィルターのリスト |
詳細
- 組み込みUIの作成と使用方法:組み込みオートフィルター
- ルール構文、演算子、データ解析:条件付きフィルター