trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

ComboBoxはTextBox?

ComboBoxについて、意外にみなさん理解されていないケースをみかけますので、まとめておきます。

まず、ComboBoxですが、TextBox部分とDropDownList部分が合体したものです。こんなの当たり前じゃんという人も多いかとは思いますが、実は本当に理解していない人が多いようです。

考え方として、ComboBoxはTextBoxだと思ってください。DropDownListと一緒くたに考えるからわからなくなります。DropDownListはあくまでTextBoxに人間が手動で入力する際の補助機能(便利機能)だと思ってください。ComboBoxの本質(主役)はTextBoxなのです。そのTextBoxにDropDownListという補助機能を付けたものがComboBoxなのです。

ここまで理解できれば、あとは簡単です。

1.ComboBoxのitemsや、DisplayMemberとValueMemberで設定するのは、ComoboBoxのDropDownListの部分である。

2.ComoboBoxのTextプロパティは、ComoboBoxのTextBoxの部分である。

以上より、ComoboBoxのTextプロパティにデータテーブルをバインドしても、ComoboBoxのDropDownListの部分とは無関係であることが理解できると思います。

さて、ついでですので、上のバインドについても解説しておきます。バインドは、例えば、

combBox1.DataBindings.Add("Text", dataSet1.Tables["hogeTable"], "fooColumn");

のように行います。ComboBoxにバインドしていますが、先ほどから述べていますように、Textプロパティにバインドしていますから、ComboBoxのTextBox部分にバインドしています。ですから、このコントロールはComboBoxではなく、TextBoxだと思ってもかまいません。

話を元に戻します。今、hogeTableにバインドしています。初期状態でCurrencyManagerのPositionは1ですから、hogeTableの1行目にバインドしていることになります。ここで、ComboBoxに手動で入力すると、バインドしているため、hogeTableの1行目が書き換わります。では、1行目ではなく、3行目を書き換えるにはどうしたらいいでしょうか?それは、CurrencyManagerのPositionを次の次に進めます。そうすると、3行目が書き換わるようになります。CurrencyManagerについてここでは多く語りませんが、何となくわかったかと思います。興味があれば、調べてみて下さい。

ここでよくある過ちを書いておきます。hogeTableのfooColumnがint型の時、ComboBoxに空白などのint型以外の値を入れたらどうなるでしょう? 当然、hogeTableは更新されません。ComboBoxは、今入れたint型以外の値がキャンセルされ、それを入力される直前に表示されていた値に戻ってしまいます。オペレータから見れば、なぜ入らないんだ?と疑問に思う仕様ですので、この場合は、Validatingイベントで、きっちりと入力チェックをすべきでしょう。

と、ここまで書きましたが、実はDisplayMemberとValueMemberにより、SelectedValueで値を取ることも一般的です。そういう意味では、ここではComboBoxの一面を取り上げました。全てを語るのは大変です。それが今日のタイトルである、ComboBoxってTextBox?の?につながっているわけです。(^^;