はじめに
コンボボックスの項目数が増えてくると、ユーザーが目的の項目を探すのが大変になります。
そこで活躍するのが、ComboBox の FindString / FindStringExact メソッドです。
キーワードから項目を検索し、見つかった位置(インデックス)を教えてくれます。
FindString / FindStringExact の基本
| メソッド | 役割 |
|---|---|
FindString(string s) |
指定した文字列で始まる最初の項目を検索(前方一致・あいまい検索)。 |
FindString(string s, int startIndex) |
startIndex の次の項目から検索を開始。 |
FindStringExact(string s) |
文字列が完全一致する項目を検索。 |
FindStringExact(string s, int startIndex) |
startIndex の次から完全一致の項目を検索。 |
int(インデックス)で返され、見つからなかった場合は -1 が返されます。
FindStringメソッド(前方一致検索)
FindString は、「指定したテキストで始まる最初の項目」を探します。
部分一致ではありますが、「先頭からの一致」が条件です。
基本的な使い方
// "To" で始まる最初の項目を探す
int index = comboBox1.FindString("To");
if (index != -1)
{
comboBox1.SelectedIndex = index;
}
else
{
MessageBox.Show("該当する項目が見つかりません。");
}
この例では、「Tokyo」「Tochigi」など、"To" で始まる項目が対象になります。
startIndex を指定して次の候補を探す
// 1つ目の "To" を探す
int index = comboBox1.FindString("To");
// 次の "To" を探す
int nextIndex = comboBox1.FindString("To", index);
startIndex を使うと、「次の候補」「さらに次の候補」と順番に検索できます。
検索が終端まで到達した場合、先頭に戻って検索を続ける仕様です。
FindStringExactメソッド(完全一致検索)
FindStringExact は、指定した文字列と完全に同じ項目を探します。
「前方一致」ではなく、「全体一致」です。
基本的な使い方
// "Tokyo" と完全に一致する項目を探す
int index = comboBox1.FindStringExact("Tokyo");
if (index != -1)
{
comboBox1.SelectedIndex = index;
}
「Tokyo」と「Tokyo(半角スペース付き)」や「Tokyo City」は別物として扱われ、
完全に一致するものだけがヒットします。
startIndex を指定して複数候補を探す
int index = comboBox1.FindStringExact("大阪");
while (index != -1)
{
// 何らかの処理
Console.WriteLine($"見つかったインデックス: {index}");
// 次の「大阪」を探す
index = comboBox1.FindStringExact("大阪", index);
}
同じテキストを持つ項目が複数ある場合にも、順にたどることができます。
FindString と FindStringExact の違い
| 項目 | FindString | FindStringExact |
|---|---|---|
| 一致条件 | 前方一致(指定文字列で始まる) | 完全一致(文字列全体が同じ) |
| 用途 | 「とりあえず先頭から合うもの」を探したい | 「この文字列とぴったり同じもの」を探したい |
| 例 | “To” → “Tokyo”, “Tochigi” など | “Tokyo” → “Tokyo” のみ |
候補を選択する場合、まずは
FindString を使うのが手軽です。厳密さが必要なときは
FindStringExact を選びましょう。
実用例:検索ボタンで項目ジャンプ
テキストボックスに検索文字列を入れて、該当する項目へジャンプする例です。
private void buttonFind_Click(object sender, EventArgs e)
{
string keyword = textBoxKeyword.Text;
if (string.IsNullOrWhiteSpace(keyword))
{
MessageBox.Show("検索文字列を入力してください。");
return;
}
// 前方一致で検索
int index = comboBox1.FindString(keyword);
if (index != -1)
{
comboBox1.SelectedIndex = index;
}
else
{
MessageBox.Show("該当する項目が見つかりません。");
}
}
「完全一致にしたい」ときは FindString を FindStringExact に変更するだけでOKです。
実用例:次を検索 / 前を検索 風のUI
「F3で次を検索」のような機能をコンボボックスに追加するイメージの例です。
private int _lastIndex = -1;
private void buttonFindNext_Click(object sender, EventArgs e)
{
string keyword = textBoxKeyword.Text;
if (string.IsNullOrEmpty(keyword)) return;
// 前回のインデックスから次を検索
_lastIndex = comboBox1.FindString(keyword, _lastIndex);
if (_lastIndex != -1)
{
comboBox1.SelectedIndex = _lastIndex;
}
else
{
MessageBox.Show("これ以上見つかりません。先頭から検索し直します。");
_lastIndex = -1;
}
}
このように、startIndex を覚えておくことで、「次へ」「さらに次へ」と段階的に検索できます。
注意点
- 戻り値が -1 のときは必ずチェック
見つからなかった場合の処理(メッセージ表示・何もしない等)を忘れないようにしましょう。 - 大小文字の扱い
通常、文字列比較は大文字小文字を区別せずに行われます(”Tokyo” と “tokyo” は同一扱い)。 - 部分一致ではない
FindString は「前方一致」であり、「含まれていればOK」ではありません。
「含まれていれば」をやりたい場合は、自分でItemsをループしてContainsなどで判定する必要があります。 - DataSource 使用時も利用可能
DataSource バインドをしていても、表示テキストに対して検索が行われます。
まとめ
FindString… 「指定文字列で始まる」項目を検索する前方一致メソッド。FindStringExact… 文字列が完全に一致する項目を検索するメソッド。- どちらも「見つかったインデックス」または「-1」を返す。
startIndexを指定することで、「次を検索」「さらに次を検索」が実装できる。- 入力補助・検索機能付きコンボボックスを作る際の基本メソッドとして覚えておくと便利。
コンボボックス内検索をうまく活用すると、
「項目が多くてスクロールが大変」という状態から一気に快適なUIになります。
まずは FindString で簡単な検索ボタンを作ってみて、そのあと必要に応じて FindStringExact や startIndex 付きのオーバーロードにも挑戦してみてください。

コメント