概要
ReoGrid には、1つまたは複数のワークシートをまたいでセル内のテキストを検索するAPIが組み込まれています。検索結果を1件ずつ前後に移動したり、一致するセルをハイライト表示したり、すべての結果を一括取得したりすることができます。
テキスト検索のクラスは unvell.ReoGrid.TextSearch 名前空間に含まれています。
using unvell.ReoGrid.TextSearch;
基本的な使い方
単一ワークシートを検索する
TextSearchSession に Worksheet を渡すと、そのワークシート内だけを検索します。
var session = new TextSearchSession(grid.CurrentWorksheet, "hello");
session.Search();
// 次の一致セルに移動
var match = session.NextMatch();
if (match != null)
{
grid.CurrentWorksheet.SelectionRange = match.Cell.PositionAsRange;
}
ワークブック全体を検索する
IWorkbook(グリッドコントロール)を渡すと、すべてのワークシートを横断して検索します。
var session = new TextSearchSession(grid, "hello");
session.Search();
var match = session.NextMatch();
if (match != null)
{
match.Cell.Worksheet.SelectionRange = match.Cell.PositionAsRange;
}
特定のワークシートだけを検索する
検索対象を絞りたい場合は、ワークシートのリストを渡します。
var sheets = new List<Worksheet> { grid.Worksheets[0], grid.Worksheets[1] };
var session = new TextSearchSession(sheets, "hello");
session.Search();
結果のナビゲーション
Search() を呼び出した後、NextMatch() と PreviousMatch() で結果を前後に移動できます。一致がない場合は null が返ります。
// 次の結果に移動
var match = session.NextMatch();
// 前の結果に移動
var match = session.PreviousMatch();
ループ検索
デフォルトでは LoopSearch が true に設定されており、最後の結果から最初に折り返します。false に設定すると端で停止します。
session.LoopSearch = false;
var match = session.NextMatch();
if (match == null)
{
MessageBox.Show("これ以上結果がありません。");
}
すべての一致を取得する
Matches プロパティを使うと、検索結果をまとめて取得できます。
var session = new TextSearchSession(grid, "hello");
session.Search();
foreach (var match in session.Matches)
{
Console.WriteLine($"発見場所: {match.Cell.Position}, 文字位置: {match.TextIndex}");
}
ITextSearchMatch インターフェースのプロパティは以下の通りです。
| プロパティ | 型 | 説明 |
|---|---|---|
Cell | Cell | 一致したテキストを含むセル |
TextIndex | int | セルの表示テキスト内での一致開始位置(文字インデックス) |
一致セルをハイライトする
HighlightTextSearchSession を使用すると、一致したすべてのセルをハイライト表示できます。
var session = new HighlightTextSearchSession(grid, "hello", grid.CurrentWorksheet);
session.Search();
// すべての一致をゴールド色でハイライト
session.MarkAllResultHighlight(SolidColor.Goldenrod);
// ナビゲーション
var match = session.NextMatch();
if (match != null)
{
match.Cell.Worksheet.SelectionRange = match.Cell.PositionAsRange;
}
ハイライトを解除する(例:キーワードが変更されたとき):
session.UnmarkAllResultHighlight();
実装例:検索ダイアログ
次・前・すべて検索の機能を持つ検索ダイアログを構築するサンプルです。
HighlightTextSearchSession searchSession = null;
HighlightTextSearchSession GetOrCreateSession(string keyword)
{
if (searchSession == null)
{
searchSession = new HighlightTextSearchSession(grid, keyword, grid.CurrentWorksheet);
searchSession.Search();
searchSession.MarkAllResultHighlight(SolidColor.Goldenrod);
searchSession.LoopSearch = true;
}
return searchSession;
}
void OnKeywordChanged(string newKeyword)
{
// 以前のセッションのハイライトを解除
searchSession?.UnmarkAllResultHighlight();
searchSession = null;
}
void FindNext(string keyword)
{
var match = GetOrCreateSession(keyword).NextMatch();
if (match != null)
match.Cell.Worksheet.SelectionRange = match.Cell.PositionAsRange;
}
void FindPrevious(string keyword)
{
var match = GetOrCreateSession(keyword).PreviousMatch();
if (match != null)
match.Cell.Worksheet.SelectionRange = match.Cell.PositionAsRange;
}
IEnumerable<ITextSearchMatch> FindAll(string keyword)
{
return GetOrCreateSession(keyword).Matches;
}
APIリファレンス
TextSearchSession
| メンバー | 説明 |
|---|---|
TextSearchSession(IWorkbook, string, Worksheet?) | ワークブック全体のワークシートを検索 |
TextSearchSession(IEnumerable<Worksheet>, string, Worksheet?) | 指定したワークシートを検索 |
TextSearchSession(Worksheet, string) | 単一のワークシートを検索 |
void Search() | 検索を実行する。ナビゲーション前に必ず呼び出すこと |
ITextSearchMatch NextMatch() | 次の一致を返す。なければ null |
ITextSearchMatch PreviousMatch() | 前の一致を返す。なければ null |
IEnumerable<ITextSearchMatch> Matches | すべての一致結果 |
ITextSearchMatch CurrentMatch | 現在の一致位置を取得・設定 |
bool LoopSearch | 末尾に達した際に先頭へ折り返すか(デフォルト: true) |
string Text | 検索キーワード |
List<Worksheet> Worksheets | 検索対象のワークシートリスト |
HighlightTextSearchSession
TextSearchSession を継承し、ハイライト機能を追加したクラスです。
| メンバー | 説明 |
|---|---|
void MarkAllResultHighlight(SolidColor color) | すべての一致セルを指定色でハイライト |
void UnmarkAllResultHighlight() | すべてのハイライトを解除 |