FlexGrid for WPF
コードを使用したセルおよびオブジェクトの選択
基本操作 > 選択 > 選択範囲と選択モード > コードを使用したセルおよびオブジェクトの選択

Selection プロパティは読み書き可能なので、コードを使って簡単にセル範囲を選択できます。また、Windows フォームの C1FlexGrid と同様に、Select メソッドを使って選択を実行することもできます。Select メソッドを使用すると、セルまたは範囲を選択できるほか、新しい選択範囲を表示範囲までスクロールしてユーザーに表示することもできます。

たとえば、グリッド内の最初のセルを選択し、そのセルがユーザーに表示されるようにするには、次のようなコードを使用します。

C#
コードのコピー
// 行 0、列 0 を選択して、このセルが表示されるようにします
grid.Select(0, 0, true);

これらの選択方法はすべて、行および列インデックスに基づいて機能します。ただし、セルの内容に基づいて選択を行うこともできます。たとえば、次のコードは、グリッドの「氏名」列に特定の文字列を含む最初の行を選択します。

C#
コードのコピー
bool SelectName(string name)
{
  // "Name" 列の特定の文字列を含む行を検索します
  int col = _flexGroup.Columns["Name"].Index;
  int row = FindRow(grid, name, grid.Selection.Row, col, true);
  if (row > -1)
  {
    grid.Select(row, col);
    return true;
  }
  // 見つからない場合...
  return false;
}

次のように定義された FindRow ヘルパーメソッドを使用します。

C#
コードのコピー
// 指定した列に特定のテキストを含む行を検索します
int FindRow(C1FlexGrid grid, string text,
            int startRow, int col, bool wrap)
{
  int count = grid.Rows.Count;
  for (int off = 0; off <= count; off++)
  {
    // 下端まで到達し、折り返さない場合は、ここで終了します
    if (!wrap && startRow + off >= count)
    {
      break;
    }

    // 行からテキストを取得します
    int row = (startRow + off) % count;
    var content = grid[row, col];

    // 見つかった場合は、行インデックスを返します
    if (content != null &&
        content.ToString().IndexOf(text,
        StringComparison.OrdinalIgnoreCase) > -1)
    {
      return row;
    }
  }

  // 見つからない場合...
  return -1;
}

FindRow メソッドは、指定された行から開始して指定された列で文字列を検索します。オプションで、文字列が見つからなかった場合には折り返して先頭から検索をやり直します。これは、多くのシナリオで使用される柔軟性の高い方法です。選択を実行するもう 1 つの一般的なシナリオは、データソース内で特定のオブジェクトを選択する場合です。この場合は、PagedCollectionView.IndexOf メソッドを使用してソースコレクション内でオブジェクトのインデックスを見つけ、次にそのインデックスを使用して行を選択するという方法が考えられます。しかし、この方法には、データがグループ化されていない場合にしか機能しないという問題があります。データがグループ化されている場合は、グループ行もカウントされるため、データソース内の項目のインデックスはグリッドの行インデックスと一致しません。

この問題を簡単に解決する方法としては、行を列挙し、各行の DataItem プロパティと検索対象の項目を比較します。次のコードは、この方法を示しています。

C#
コードのコピー
var customer = GetSomeCustomer;

#if false // ** これは使用しないでください。グループ化されたデータでは無効です

  int index = view.IndexOf(customer);
  if (index > -1)
  {
    grid.Select(index, 0);
  }

#else // こちらがグリッド内のオブジェクトを検索する安全な方法です

  for (int row = 0; row <= grid.Rows.Count; row++)
  {
    if (row.DataItem == customer)
    {
      grid.Select(row, 0);
      break;
    }
  }
#endif
関連トピック