組み込みオートフィルター

ReoGridにはExcelのような列フィルターが含まれています。列ごとにドロップダウンを構築し、その列からユニークな値を収集して、ユーザーが行の表示/非表示やデータの並べ替えを行えるようにします。

列フィルターの作成

Worksheet.CreateColumnFilter を使用して、1つまたは複数の列に組み込みUIをアタッチします。フィルターは指定した範囲(タイトル行を除く)をスキャンして候補リストを構築します。

// put data on the sheet
worksheet["C1:C5"] = new object[] { "A", "B", "C", "D", "E" };

// create a filter on column C, no title rows
var filter = worksheet.CreateColumnFilter("C", "C", titleRows: 0);

一般的なオーバーロード:

  • CreateColumnFilter() – 現在の使用範囲をカバーします。
  • CreateColumnFilter(string startColumn, string endColumn, int titleRows = 0, AutoColumnFilterUI ui = AutoColumnFilterUI.DropdownButtonAndPanel)
  • CreateColumnFilter(RangePosition range, AutoColumnFilterUI ui = AutoColumnFilterUI.DropdownButtonAndPanel)

デフォルトでは、各列ヘッダーにドロップダウンボタンが追加されます:143

クリックすると候補リスト(DisplayText から収集)が表示されます:144

UIなしでフィルターを作成するには、AutoColumnFilterUI.NoGUI を渡します:

var filter = worksheet.CreateColumnFilter("C", "C", 0, AutoColumnFilterUI.NoGUI);

NoGUI の場合、候補をすべてコードで制御します。列ごとに SelectedTextItems を追加または削除し、条件が変更されたときに Apply() を呼び出します。

WPF:カスタムテンプレート

WPFビルドを使用する場合、DataTemplate で組み込みUIをスタイル設定できます:

  • AutoColumnFilter.FilterButtonTemplate – 列ヘッダーに表示されるドロップダウンボタンのテンプレート(各 AutoColumnFilterBody.DropdownButtonTemplate に伝播されます)。
  • AutoColumnFilter.FilterPopupItemTemplate – フィルターポップアップリストの各項目のテンプレート(デフォルトはチェックボックス + テキスト)。ColumnFilterPopupItemTextIsChecked などのプロパティにバインドします。
  • DropdownHeaderCell.DropdownButtonTemplate(特定の列フィルターボディ上) – 列ごとに異なるボタンが必要な場合のオーバーライド。

例:

<DataTemplate x:Key="FilterButtonTemplate">
  <Grid Width="16" Height="16">
    <Path Data="M0,0 L8,8 L16,0 Z" Fill="DarkSlateGray"/>
  </Grid>
</DataTemplate>

<DataTemplate x:Key="FilterItemTemplate">
  <StackPanel Orientation="Horizontal" Margin="4,2">
    <CheckBox IsChecked="{Binding IsChecked}" />
    <TextBlock Text="{Binding Text}" Margin="6,0,0,0"/>
  </StackPanel>
</DataTemplate>
var filter = worksheet.CreateColumnFilter("C", "E");
filter.FilterButtonTemplate = (DataTemplate)FindResource("FilterButtonTemplate");
filter.FilterPopupItemTemplate = (DataTemplate)FindResource("FilterItemTemplate");

プログラムによるフィルタリング

コードで選択された項目を制御できます:

filter.Columns["C"].SelectedTextItems.Clear();
filter.Columns["C"].SelectedTextItems.AddRange(new[] { "A", "C", "D" });
filter.Apply();

並べ替え

Worksheet.SortColumn を使用して列を並べ替えます。並べ替えは適用範囲内の他の列も同期して移動させます。

// sort on column "C"
worksheet.SortColumn("C", order: SortOrder.Descending);

並べ替えの移動が許可される範囲を制限することもできます:

worksheet.SortColumn(
    columnIndex: 1,                         // column B (zero-based)
    applyRange: new RangePosition("A1:B5"),
    order: SortOrder.Descending);

結果: 152

ReoGridエディタでのフィルター作成

エディタアプリで、データ範囲(タイトル行を除く)を選択し、Sheet → Filter を選択してドロップダウンボタンを追加します。設定例:

worksheet["C1:C6"] = new object[] { "Title", "A", "B", "C", "D", "E" };

タイトル行はフィルタリング/並べ替えから除外されます:148

並べ替えの例(Z→A):149

タイトル行はそのまま残ります:151

APIリファレンス

AutoColumnFilter

メンバー説明
WorksheetWorksheetアタッチされたワークシート
ApplyRangeRangePositionフィルタリング対象の範囲
ColumnsFilterColumnCollectionインデックスまたは列コードで列フィルターボディにアクセス
Apply()voidフィルターを再評価して行の表示/非表示を切り替え
Attach(Worksheet, AutoColumnFilterUI)voidワークシートにフィルターをアタッチ
Detach()voidワークシートからフィルターを削除
FilterButtonPressedevent列フィルターボタンがクリックされたときに発生

FilterColumnCollection

メンバー説明
this[int index]ゼロベースの列インデックスで列フィルターボディを取得
this[string columnCode]列アドレスコード(例:"C")で列フィルターボディを取得

AutoColumnFilterBody

フィルター内の各列には、以下のメンバーを持つ AutoColumnFilterBody があります:

メンバー説明
ColumnHeaderColumnHeader列ヘッダーインスタンス
IsSelectAllboolすべての項目が選択されているかどうか(列がフィルタリングされていない)
SelectedTextItemsTextFilterCollection選択された(表示される)テキスト値のセット
GetDistinctItems()List<string>列内のすべてのユニークな値を取得

TextFilterCollection

メソッド説明
Add(string item)選択セットに項目を追加
AddRange(IEnumerable<string> items)複数の項目を追加
Remove(string item)項目を削除
Clear()選択された項目をすべてクリア
Contains(string item)項目が選択されているか確認
Count選択された項目の数
this[string item]項目が選択されているかどうかを取得または設定

AutoColumnFilterUI列挙型

説明
NoGUIUI要素は作成されない
DropdownButtonヘッダーにドロップダウンボタンのみを表示
DropdownButtonAndPanelドロップダウンボタンと組み込みフィルターパネルを表示(デフォルト)

FilterButtonPressedEventArgs

プロパティ説明
ColumnHeaderColumnHeaderボタンが押された列ヘッダー
IsCancelledbooltrue に設定すると組み込みポップアップの表示を防止
filter.FilterButtonPressed += (s, e) =>
{
    // Show custom filter UI instead of built-in popup
    e.IsCancelled = true;
    ShowCustomFilterDialog(e.ColumnHeader);
};

関連トピック


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