FlexGrid for WPF
検索とフィルタ処理
ミュージックライブラリサンプル > 検索とフィルタ処理

このサンプルには数千曲が含まれています。曲はアーティストとアルバムによって分類されていますが、スクロールして特定の曲を探すことは実用的ではありません。

このサンプルでは、検索機能を実装することにより、これに対処します。検索ボックスに文字列を入力すると、コンテンツが自動的にフィルタされて、指定した文字列を含むタイトルの曲、アーティスト、またはアルバムのみが表示されます。ここでは、SearchBox コントロールの外観と動作について簡単に説明します。

このコントロールには、次の 2 つのプロパティがあります。

ユーザーが SearchBox コントロールに入力すると、タイマーが動き始めます。入力が短時間(800 ミリ秒)中断すると、フィルタがデータソースに適用されます。すべての文字について入力の直後にフィルタ処理すると、効率が悪く、ユーザーにとっては煩わしいので、行われません。

この処理に使用されるタイマーのクラスは、C1FlexGrid アセンブリで定義されます。

フィルタを適用するために、SearchBox コントロールは View.Filter プロパティに対して、各データ項目をチェックするメソッドを設定し、FilterProperties メンバによって指定されたプロパティの少なくとも 1 つに、ユーザーが入力した検索文字列が含まれている項目のみを保持します。

コードは、次のようになります。

コードのコピー
void _timer_Tick(object sender, EventArgs e)
{
   _timer.Stop();
  if (View != null && _propertyInfo.Count > 0)
  {
    View.Filter = null;
    View.Filter = (object item) =>
    {
      // 検索テキストを取得します。
      var srch = _txtSearch.Text;
      // テキストがない場合、すべての項目を表示します。
      if (string.IsNullOrEmpty(srch))
      {
        return true;
      }
      // 任意の指定したプロパティのテキストを含む項目を表示します。
      foreach (PropertyInfo pi in _propertyInfo)
      {
        var value = pi.GetValue(item, null) as string;
        if (value != null &&
        value.IndexOf(srch, StringComparison.OrdinalIgnoreCase) > -1)
        {
          return true;
        }
      }
      // この項目を除外します。
      return false;
    };
  }
}

このコードで注目する部分は、フィルタを適用するブロックです。そこでは、通常のメソッドの代わりにラムダ関数を使用していますが、効果は同じです。ラムダ関数は、リフレクションを使用することにより、指定された各プロパティの値を取得し、検索文字列を含むかどうかをチェックします。一致が見つかると、その項目が表示されます。見つからなければ、フィルタで除外されます。

SearchBox コントロールをアプリケーションに接続するには、View プロパティと FilterProperties プロパティを設定する必要があります。このサンプルでは、View プロパティを曲のデータソースに設定し、ArtistAlbumName の各プロパティを FilterProperties コレクションに追加して、ユーザーがこれらの要素を検索できるようにします。SearchBox をアプリケーションに接続するコードは次のとおりです。

コードのコピー
//「検索」ボックスを設定します。
_srchTunes.View = view;
foreach (string name in "Artist|Album|Name".Split('|'))
{
  _srchTunes.FilterProperties.Add(typeof(Song).GetProperty(name));
}
関連トピック