.NET TIPS

テキストボックスでオートコンプリート機能を使用するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/03/10

 .NET Framework 2.0のTextBoxコントロール(System.Windows.Forms名前空間)にはオートコンプリート機能が追加されている*。この機能は、TextBoxコントロールに文字の一部を入力すると、その入力内容を予測して、入力される可能性のある項目(=補完候補)の一覧を表示したり、文字の続きを自動的に補完したりする機能である。

* オートコンプリート機能は、TextBoxコントロールのほかにComboBoxコントロールや、ツールバー(ToolStripコントロール)内に配置するToolBoxTextBoxコントロールおよびToolBoxComboBoxコントロールでも使用できる。


TextBoxコントロールのオートコンプリート機能による補完
テキストボックスに「http://www.at」と入力したところ。 IEなどで入力されたURLの履歴から補完候補の一覧を表示し、かつ 入力した文字の後半部分(図中の反転している部分)を自動的に補完する機能がある。このサンプル・プログラムは、オートコンプリート機能の設定に必要な2つのプロパティの値を動的に変更して、オートコンプリート機能の挙動を確認するためのもの。詳細は本文後半を参照。

 Windowsアプリケーションでは、IEのアドレス・バーやエクスプローラのアドレス・バー、[ファイルを開く]ダイアログのファイル名入力部分などがオートコンプリート機能を持っているが、これらと同等の機能を独自アプリケーションのテキストボックスに持たせることが可能だ。

 オートコンプリート機能により一覧表示されたり、入力文字に追加されたりする補完候補のリスト(=オートコンプリート機能のソース)としては、IEのアドレス・バーで入力されたURLの履歴や、ファイルシステム(ドライブ内のディレクトリ名やファイル名)などを指定できる。また独自の文字列のリストもソースとして指定可能だ。

オートコンプリート機能に必要な設定

 TextBoxコントロールでオートコンプリート機能を使用可能にするには、AutoCompleteModeプロパティとAutoCompleteSourceプロパティの2つを設定する。

 AutoCompleteModeプロパティはオートコンプリート機能の動作を指定するためのもので、AutoCompleteMode列挙体(System.Windows.Forms名前空間)の値を指定する。これによって補完候補の一覧をドロップダウン・リストとして表示するか、入力した文字の後ろに続けて補完候補を表示するか(あるいはこれらの組み合わせか)を選択できる。

 一方、AutoCompleteSourceプロパティにはオートコンプリート機能のソースとなる参照先をAutoCompleteSource列挙体(System.Windows.Forms名前空間)の値で指定する。これにより補完候補としてURLの履歴や、ファイルシステムなどを指定できる。

 AutoCompleteSourceプロパティにAutoCompleteSource.CustomSourceを設定して、独自の補完候補を利用することも可能だが、これについては「TIPS:オートコンプリート機能で独自の補完候補を使用するには?」で解説している。

 例えば次の画面は、「AutoCompleteMode.Suggest」と「AutoCompleteSource.AllUrl」を設定した場合に表示される補完候補の一覧の例である。この設定はIEのアドレス・バーとほぼ同じ仕様である。


AutoCompleteSource. AllUrl指定時のオートコンプリート
URLの履歴をソースとして設定した場合、「http://〜」と入力する以外にも、(IEのアドレス・バーと同様に)「http://www.xxx〜」のxxxの部分を入力しただけでもURLの補完候補が表示される。

 また、次の例は「AutoCompleteMode.Suggest」と「AutoCompleteSource. AllSystemSources」を指定した場合だ。これはエクスプローラのアドレス・バーとほぼ同じ仕様となる。つまりURLやディレクトリ、ファイルが補完候補となる。


AutoCompleteSource. AllSystemSources指定時のオートコンプリート
「c:\Program Files\mi」と入力すると、c:\Program Filesディレクトリにある「mi」で始まるディレクトリ名の一覧が補完候補として表示される。

オートコンプリート機能確認用のサンプル・プログラム

 最後に本稿で使用しているサンプル・プログラムについて解説しておく。

 このサンプル・プログラムを作成するには、Visual Studio 2005でWindowsアプリケーションのプロジェクトを新規作成し、フォームに2つのComboBoxコントロールと1つのTextBoxコントロール、文字列表示用のLabelコントロールを以下のように配置する。


サンプル・プログラムのフォーム
2つのComboBoxコントロールと1つのTextBoxコントロール、文字列表示用のLabelコントロールを配置する。

 次に、フォームをダブルクリックして、Loadイベント・ハンドラに以下のようなコードを記述する。

private void Form1_Load(object sender, EventArgs e) {
  comboBox1.DataSource = Enum.GetValues(typeof(AutoCompleteMode));
  comboBox2.DataSource = Enum.GetValues(typeof(AutoCompleteSource));
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ComboBox1.DataSource = System.Enum.GetValues(GetType(AutoCompleteMode))
  ComboBox2.DataSource = System.Enum.GetValues(GetType(AutoCompleteSource))
End Sub
Loadイベント・ハンドラに記述するコード(上:C#、下:VB)

 ここでは、各ComboBoxコントロールでAutoCompleteModeおよびAutoCompleteSource列挙体のすべての値を一覧できるように、コントロールのデータソースとしてEnum.GetValuesメソッドにより取得したコレクションを設定している(Enum.GetValuesメソッドに関しては「TIPS:列挙体の値を列挙するには?」を参照してほしい)。

 続いては、上側のComboBoxコントロールをダブルクリックして、以下のコードを記述する。このイベント・ハンドラはコンボボックスで選択されている項目が変更されたときに呼び出されるものだ。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
  textBox1.AutoCompleteMode = (AutoCompleteMode)comboBox1.Items[comboBox1.SelectedIndex];
}
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
  TextBox1.AutoCompleteMode = CType(ComboBox1.Items(ComboBox1.SelectedIndex), AutoCompleteMode)
End Sub
上側ComboBoxコントロールのSelectedIndexChangedイベント・ハンドラに記述するコード(上:C#、下:VB)

 ここでは新しく選択された値(これはAutoCompleteMode列挙体の値である)を取り出し、それをTextBoxコントロールのAutoCompleteModeプロパティに設定する。

 同様に、下側のComboBoxコントロールをダブルクリックして、以下のコードを入力する。

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) {
  try {
    textBox1.AutoCompleteSource = (AutoCompleteSource)comboBox2.Items[comboBox2.SelectedIndex];
  } catch { }
}
Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
  Try
    TextBox1.AutoCompleteSource = CType(ComboBox2.Items(ComboBox2.SelectedIndex), AutoCompleteSource)
  Catch
  End Try
End Sub
下側ComboBoxコントロールのSelectedIndexChangedイベント・ハンドラに記述するコード(上:C#、下:VB)

 AutoCompleteSource.ListItemsが選択された場合には今回のプログラムでは例外が発生してしまうが、ここではそれを無視するようにしている。以上で、サンプル・プログラムは完成である。

 ちなみに、オートコンプリート機能はWin32 APIのSHAutoComplete関数を使用して実装されているようである。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:TextBoxコントロール
使用ライブラリ:TextBoxコントロール(System.Windows.Forms名前空間)
使用ライブラリ:AutoCompleteMode列挙体(System.Windows.Forms名前空間)
使用ライブラリ:AutoCompleteSource列挙体(System.Windows.Forms名前空間)
関連TIPS:オートコンプリート機能で独自の補完候補を使用するには?
関連TIPS:
列挙体の値を列挙するには?

この記事と関連性の高い別の.NET TIPS
オートコンプリート機能で独自の補完候補を使用するには?
[ASP.NET AJAX]ComboBoxコントロールの見栄えや挙動を設定するには?
[ASP.NET AJAX]AutoCompleteコントロールでGoogleサジェスト風なオートコンプリート機能を実装するには?
[ASP.NET AJAX]ComboBoxコントロールでWindowsフォーム・ライクなコンボボックスを作成するには?
DataGridViewコントロールでオートコンプリート機能を使うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間