C#なら簡単 コンボボックスをつかって設定を反映させる
comboBox-event

コンボボックスとは文字入力と項目の選択の両方を受け付けることができる入力領域のことです。文字入力のためのテキストボックスと項目を選択するリストボックスを組み合わせたものであるためこのような名前がつけられています。

コンボボックスをつかってなにかを設定してこれを反映するアプリを作ってみることにします。

コンボボックス関連のイベント

コンボボックス関連のイベントはたくさんありますが、重要なものは

DropDownイベント
DropDownClosedイベント
SelectedIndexChangedイベント
SelectedValueChangedイベント
SelectionChangeCommittedイベント

コンボボックスの右側にある▼の部分をクリックすると項目が書かれたリストが表示されます。このときに発生するのがDropDownイベントです。項目を選択するためにクリックするとリストが閉じますが、このときに発生するのがDropDownClosedイベントです。

項目を選択するためには項目をクリックする方法と上下のキーを押下する方法があります。項目をクリックするとリストは閉じてしまいますが、上下のキーを押下する場合は選択された項目が変化するだけでリストが直ちに閉じることはありません。SelectedIndexChangedイベントとSelectedValueChangedイベントは選択された項目が変化したときに発生します。またSelectionChangeCommittedイベントは選択が確定したときに発生します。

もし何が選択されたのかを知るのであればSelectionChangeCommittedイベントが発生したときにどの項目が選択されたかを調べればよいでしょう。途中でどの項目が選択されたかではなく最終的にどれが選択されたのかを知りたいのであればSelectionChangeCommittedイベントが発生したときにどの項目が選択されたかを調べるとよいでしょう。

また最初からそのコンボボックスにどんな項目を表示させるのかが決まっている場合は、デザイナやそのコンボボックスが存在するフォームのコンストラクタで設定してしまってそのままでよいかもしれませんが、アプリケーションの状態によって異なる項目を表示させたい場合もあるかもしれません。そのときはDropDownイベントが発生したときに全項目をいったんクリアして表示すべき項目を挿入するとよいでしょう。

イベントの実験

では実際にコンボボックスがあるアプリケーションを作成してみて、どのイベントがどのタイミングで発生するのかを確認することにします。

イベントが発生したらイベントの名前とどの項目が選択されているかを調べてRichTextBoxにそれらを文字列として表示させます。

そしてこのときにStringBuilderオブジェクトを使います。文字列を連結するときは + でつなげばいいのですが、何回も文字列の連結処理をしたいときはStringBuilderオブジェクトをつかったほうが処理速度が速いです。

これで実際に動作させてみると・・・

どれも選択されていない状態で▼をクリックして「3」を選択(クリック)した場合は以下のような結果になりました。Clickイベントはマウスボタンが押されても離されないと発生しないので、最初に発生するイベントはDropDownイベントです。そのあとSelectionChangeCommittedイベントが発生し(この段階で「3」が選択されたことになっている)、DropDownClosedイベント、そのあとSelectedValueChangedイベントとSelectedIndexChangedイベントとなっています。

どれも選択されていない状態で▼をクリックして上下のキーを押下して項目を選択し、「3」が選択されているときにエンターキーを押下した場合は以下のようになります。エンターキーを押下したときにSelectionChangeCommittedイベントが発生しています。またエンターキーを押下するかわりにコンボボックスとは関係のない部分をクリックした場合はSelectionChangeCommittedイベントは発生しません。

それからTabキーを押すことでコンボボックスにフォーカスを当てることもできます。この状態で上下のキーを押下すると選択されているコンボボックスの選択項目を切り替えることができます。この場合は選択されている項目が変更するたびにSelectionChangeCommittedイベントが発生します。

またコンボボックスのテキストボックスの部分には自分で文字列を入力することができます。そのあと▼をクリックした場合はその文字列が項目内に存在する場合はそれが自動で選択されます。存在しない場合はどれも選択されません。

簡単なテストアプリ

SelectionChangeCommittedイベントがあったときだけ選択の変更が有効になるコンボボックスをつくります。有効な選択変更がおこなわれた場合、これをフォームのタイトルバーに表示します。