トップ回答者
Comboboxについて

質問
-
こんにちは。
VB2005+SQLServerExpressにて開発しています。
非常に初歩的なことですが、ちょっとわからなくなってしまいました。
TableAdapterを使用して、データソースエクスプローラーからフォームにドラッグアンドドロップをしました。
フォームのコントロールに対し、データバインドされた形になると思います。その後、comboboxを利用したほうが入力しやすい項目があり、別のTableAdapterを同じDataSet内に作成をし、
それをDataSource,DisplayMemberとしました。2つ、comboboxを作ったのですが、ValueMemberがVarchar型のものは問題なく表示、選択ができるのですが、
ValueMemberがSmallint型の場合は、DisplayMemberの値が表示されず、ValueMemberの値が表示されてしまいます。いろいろと調べているのですが、さっぱり原因がわかりません。
どうか、アドバイスお願いします。
回答
-
デザイナでComboBoxのプロパティを見ると、(DataBindings)という項目があると思います。そこでSelectedValueのみが保存したいテーブルのフィールドにバインドされていることを確認してみて下さい。、(DataBindings)にはTextプロパティもありますが、ここは(なし)で良いです。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク TI-cb400 2010年4月27日 23:39
すべての返信
-
ご回答ありがとうございます。
InitializeComponentを見てみたのですが、職員氏名をComboboxで選択できるものがあり、そちらに関しては
通常の動作ができます。また、正常に動作するComboBoxの内容と比べても、同じ記述内容になっています。
(どこかの部分がかけているなどはありません。)違いといえば、職員氏名はVarChar型の職員IDをValueMemberとしていることに対し、ValueMemberが表示
されてしまうComboboxのValueMemberはsmallint型であるということです。また、もう一点不可解な動作をするのですが、正常に動作しないComboboxのデータをドロップダウンすると
候補自体はちゃんと出るのですが、どれかを選択するとそこからフォーカスの移動ができなくなります。Comboboxをやめて、TextBoxとするtデータの保存まで問題なくできます。
データバインドしているフィールドの型とComboboxのDataSourceとしているテーブルの型が違うかと思ったのですが
ちゃんと同じ型を使用しておりました。何か、お気づきの点がありましたら、ご教授下さい。
-
自己レスです。
再度、他の部分も確認をしてみたところ、できていると思っていたComboboxは選択する候補自体がテーブルに保存されていました。
(本来は職員IDをいれたいところが、職員の氏名がそのまま入っていました。)以前は、直接コードでComboboxのDataSourceなどに挑戦していたのですが、今回はプロパティにて行っています。
ValueMemberはComboboxのDataSorceの主キーをセットしているのですが、こちらは問題ないのでしょうか。
また、SelectedItemなどはセットする必要があるのでしょうか。根本的にComboboxを理解できていないので、再度ヘルプを読んでいるのですが、以前勉強していたときは、
DataSource,DisplayMember,ValueMemberをセットすれば、Comboboxを利用できたと思ったので、上記のように
行っております。もう一度、ヘルプをしっかりと呼んでみます。
-
再度、他の部分も確認をしてみたところ、できていると思っていたComboboxは選択する候補自体がテーブルに保存されていました。
(本来は職員IDをいれたいところが、職員の氏名がそのまま入っていました。)Comboboxで選択された値、つまりSelectedValueが職員の氏名になっているのでしょうか? それともSelectedValueの値を保存されていない(もしくはバインドされていない)のでしょうか?
ValueMemberはComboboxのDataSorceの主キーをセットしているのですが、こちらは問題ないのでしょうか。
また、SelectedItemなどはセットする必要があるのでしょうか。
問題ありません。この状態であればSelectedValueは選択された項目の主キーになっているはずです。
また、SelectedItemやSelectedIndex、SelectedValueは必ずしもセットする必要はありません。Comboboxの初期値を設定したい場合などにセットします。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
ご回答ありがとうございます。
どうにも行き詰ってしまいました。
状況を整理します。フォームにデータソースからAテーブルをドラッグアンドドロップします。
その中の1つのフィールドをComboboxにして、データを選択にしたい
データソースのAテーブルが入っているDataSetにComboboxのDataSourceにしたいテーブルをTableadapterとして作成
プロパティのDataSourceにて、他のデータベース → 該当するDataSet → DataSourceとするテーブル と選択
(DataSourceには、テーブル名BindingSourceと表示されています)DisplayMemberにテーブルの表示したいフィールドをセットする
ValueMemberにテーブルの主キーのフィールドをセットする
以上が、現在まで行っている作業です。
フォームのLoad時に各テーブルのデータをFillするコードは自動的に生成されており、Comboboxの矢印のボタンをクリックすると
候補は表示されます。しかし、フォームのLoad時にはComboboxにはフォームにバインドされたテーブルのデータがそのまま表示されます。
(DisplayMemberにセットしたフィールドのデータが表示されてほしい)また、Comboboxでデータを選択すると他にフォーカスを移動することやフォームを閉じることができません。
後は、何が不足しているのでしょうか。
どうか、よろしくお願いします。 -
Aテーブルをフォームにドラッグアンドドロップする際は、「詳細」として行なっているでよろしいでしょうか? つまり、複数のテキストボックスが自動生成されます。
そのうちの一つのテキストボックスをコンボボックスに変更し、そのDataSourceをAテーブルではない別のテーブルを指定し、そのテーブルのDisplayMemberとValueMemberを指定されたということですよね。
であれば、そのコンボボックスのプロパティでDataBindingsの中にあるSelectedValueも正しくセットされていますでしょうか?
もしセットされているのであれば、以上で正常に動作するはずです。VS2005が手元に無いためVS2008で確かめましたが、VS2008では問題なく動作しています。コンボボックスで選択した値も、保存ボタンで問題なく保存できました。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
ご回答ありがとうございます。
ご指摘いただいた、SelectedValueですが、セットされておりませんでした。
また、SelectedValueにフォームとバインドしているテーブルの該当するフィールドをセットする、
選択するテーブルの主キーをセットする
とそれぞれやってみたのですが、結果は同じでした。また、Comboboxを削除して、もう一度フォームとバインドしているテーブルをデータソースの部分で開き、
該当するフィールドをComboboxにして、フォームにドラッグアンドドロップして、DataSource,DisyplayMember,ValueMemberを
セットしてみたのですが、やはり、SelectedValueはセットされませんでした。 -
自己レスです。
前回、解決したとの回答をしてしまったのですが、勘違いでした。
DataBindingのTextを「なし」とすると、Comboboxのデータの選択はできるようになるのですが、保存をしようとすると
「Nullは使用できない」
とのエラーが出ます。DataBindingのTextの削除をしても、フォームを読み込み先頭のデータがフォームに表示されるので、データバインド
されているように思えるのですが、違うのでしょうか。DataBindingの詳細にて、バインドしたいテーブルのフィールドを選択すると、Textも同時に登録がされます。
Comboboxにて、Textの部分が入力された状態だと、Comboboxで候補を選択した時点で、操作不能になります。
後は、どの部分を見ればよいでしょうか。
フォームとメインで考えているテーブルとがバインドできていないのならば、フォームを読み込んだ時点で、データが表示されない
はずと思うのですが、データが表示されてしまうのでよけいに悩んでしまいます。どうか、アドバイスお願いします。
-
デザイナでComboBoxのプロパティを見ると、(DataBindings)という項目があると思います。そこでSelectedValueのみが保存したいテーブルのフィールドにバインドされていることを確認してみて下さい。、(DataBindings)にはTextプロパティもありますが、ここは(なし)で良いです。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/- 回答としてマーク TI-cb400 2010年4月27日 23:39