ReoGrid Version 4をリリースしました。多数の新機能に対応し、機能性・パフォーマンスの両面で大幅に強化されています。新機能の詳細については、こちらをご覧ください。
テキスト検索

概要

ReoGrid には、1つまたは複数のワークシートをまたいでセル内のテキストを検索するAPIが組み込まれています。検索結果を1件ずつ前後に移動したり、一致するセルをハイライト表示したり、すべての結果を一括取得したりすることができます。

テキスト検索のクラスは unvell.ReoGrid.TextSearch 名前空間に含まれています。

using unvell.ReoGrid.TextSearch;

基本的な使い方

単一ワークシートを検索する

TextSearchSessionWorksheet を渡すと、そのワークシート内だけを検索します。

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();

ループ検索

デフォルトでは LoopSearchtrue に設定されており、最後の結果から最初に折り返します。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 インターフェースのプロパティは以下の通りです。

プロパティ説明
CellCell一致したテキストを含むセル
TextIndexintセルの表示テキスト内での一致開始位置(文字インデックス)

一致セルをハイライトする

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()すべてのハイライトを解除

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