none
Comboboxについて RRS feed

  • 質問

  • こんにちは。

    VB2005+SQLServerExpressにて開発しています。

    非常に初歩的なことですが、ちょっとわからなくなってしまいました。

    TableAdapterを使用して、データソースエクスプローラーからフォームにドラッグアンドドロップをしました。
    フォームのコントロールに対し、データバインドされた形になると思います。

    その後、comboboxを利用したほうが入力しやすい項目があり、別のTableAdapterを同じDataSet内に作成をし、
    それをDataSource,DisplayMemberとしました。

    2つ、comboboxを作ったのですが、ValueMemberがVarchar型のものは問題なく表示、選択ができるのですが、
    ValueMemberがSmallint型の場合は、DisplayMemberの値が表示されず、ValueMemberの値が表示されてしまいます。

    いろいろと調べているのですが、さっぱり原因がわかりません。

    どうか、アドバイスお願いします。

    2010年4月16日 9:58

回答

  • デザイナでComboBoxのプロパティを見ると、(DataBindings)という項目があると思います。そこでSelectedValueのみが保存したいテーブルのフィールドにバインドされていることを確認してみて下さい。、(DataBindings)にはTextプロパティもありますが、ここは(なし)で良いです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク TI-cb400 2010年4月27日 23:39
    2010年4月20日 15:02
    モデレータ

すべての返信

  • どのようにバインドされているのか、InitializeComponent()内に自動生成されているバインドするためのコードを調査されてみてはいかがでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月16日 15:22
    モデレータ
  • ご回答ありがとうございます。

    InitializeComponentを見てみたのですが、職員氏名をComboboxで選択できるものがあり、そちらに関しては
    通常の動作ができます。

    また、正常に動作するComboBoxの内容と比べても、同じ記述内容になっています。
    (どこかの部分がかけているなどはありません。)

    違いといえば、職員氏名はVarChar型の職員IDをValueMemberとしていることに対し、ValueMemberが表示
    されてしまうComboboxのValueMemberはsmallint型であるということです。

    また、もう一点不可解な動作をするのですが、正常に動作しないComboboxのデータをドロップダウンすると
    候補自体はちゃんと出るのですが、どれかを選択するとそこからフォーカスの移動ができなくなります。

    Comboboxをやめて、TextBoxとするtデータの保存まで問題なくできます。

    データバインドしているフィールドの型とComboboxのDataSourceとしているテーブルの型が違うかと思ったのですが
    ちゃんと同じ型を使用しておりました。

    何か、お気づきの点がありましたら、ご教授下さい。

    2010年4月16日 21:48
  • 自己レスです。

    再度、他の部分も確認をしてみたところ、できていると思っていたComboboxは選択する候補自体がテーブルに保存されていました。
    (本来は職員IDをいれたいところが、職員の氏名がそのまま入っていました。)

    以前は、直接コードでComboboxのDataSourceなどに挑戦していたのですが、今回はプロパティにて行っています。

    ValueMemberはComboboxのDataSorceの主キーをセットしているのですが、こちらは問題ないのでしょうか。
    また、SelectedItemなどはセットする必要があるのでしょうか。

    根本的にComboboxを理解できていないので、再度ヘルプを読んでいるのですが、以前勉強していたときは、
    DataSource,DisplayMember,ValueMemberをセットすれば、Comboboxを利用できたと思ったので、上記のように
    行っております。

    もう一度、ヘルプをしっかりと呼んでみます。

    2010年4月16日 23:17
  • 再度、他の部分も確認をしてみたところ、できていると思っていたComboboxは選択する候補自体がテーブルに保存されていました。
    (本来は職員IDをいれたいところが、職員の氏名がそのまま入っていました。)

    Comboboxで選択された値、つまりSelectedValueが職員の氏名になっているのでしょうか? それともSelectedValueの値を保存されていない(もしくはバインドされていない)のでしょうか?

    ValueMemberはComboboxのDataSorceの主キーをセットしているのですが、こちらは問題ないのでしょうか。
    また、SelectedItemなどはセットする必要があるのでしょうか。

    問題ありません。この状態であればSelectedValueは選択された項目の主キーになっているはずです。
    また、SelectedItemやSelectedIndex、SelectedValueは必ずしもセットする必要はありません。Comboboxの初期値を設定したい場合などにセットします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月17日 2:39
    モデレータ
  • ご回答ありがとうございます。

    どうにも行き詰ってしまいました。
    状況を整理します。

    フォームにデータソースからAテーブルをドラッグアンドドロップします。

    その中の1つのフィールドをComboboxにして、データを選択にしたい

    データソースのAテーブルが入っているDataSetにComboboxのDataSourceにしたいテーブルをTableadapterとして作成

    プロパティのDataSourceにて、他のデータベース → 該当するDataSet → DataSourceとするテーブル と選択
    (DataSourceには、テーブル名BindingSourceと表示されています)

    DisplayMemberにテーブルの表示したいフィールドをセットする

    ValueMemberにテーブルの主キーのフィールドをセットする

    以上が、現在まで行っている作業です。

    フォームのLoad時に各テーブルのデータをFillするコードは自動的に生成されており、Comboboxの矢印のボタンをクリックすると
    候補は表示されます。

    しかし、フォームのLoad時にはComboboxにはフォームにバインドされたテーブルのデータがそのまま表示されます。
    (DisplayMemberにセットしたフィールドのデータが表示されてほしい)

    また、Comboboxでデータを選択すると他にフォーカスを移動することやフォームを閉じることができません。

    後は、何が不足しているのでしょうか。
    どうか、よろしくお願いします。

    2010年4月17日 19:42
  • Aテーブルをフォームにドラッグアンドドロップする際は、「詳細」として行なっているでよろしいでしょうか? つまり、複数のテキストボックスが自動生成されます。
    そのうちの一つのテキストボックスをコンボボックスに変更し、そのDataSourceをAテーブルではない別のテーブルを指定し、そのテーブルのDisplayMemberとValueMemberを指定されたということですよね。
    であれば、そのコンボボックスのプロパティでDataBindingsの中にあるSelectedValueも正しくセットされていますでしょうか?
    もしセットされているのであれば、以上で正常に動作するはずです。VS2005が手元に無いためVS2008で確かめましたが、VS2008では問題なく動作しています。コンボボックスで選択した値も、保存ボタンで問題なく保存できました。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク TI-cb400 2010年4月18日 9:04
    • 回答としてマークされていない TI-cb400 2010年4月20日 14:05
    2010年4月18日 2:14
    モデレータ
  • ご回答ありがとうございます。

    ご指摘いただいた、SelectedValueですが、セットされておりませんでした。

    また、SelectedValueにフォームとバインドしているテーブルの該当するフィールドをセットする、
    選択するテーブルの主キーをセットする
    とそれぞれやってみたのですが、結果は同じでした。

    また、Comboboxを削除して、もう一度フォームとバインドしているテーブルをデータソースの部分で開き、
    該当するフィールドをComboboxにして、フォームにドラッグアンドドロップして、DataSource,DisyplayMember,ValueMemberを
    セットしてみたのですが、やはり、SelectedValueはセットされませんでした。

    2010年4月18日 7:27
  • 自己レスです。

    あれからいろいろと調べていたのですが、DataBindingのTextの部分にバインドするテーブルのフィールドが
    入っており、それを削除したところ、できるようになりました。

    いろいろとアドバイス、ありがとうございました。

    少しずつですが、理解できてくると開発が楽しくなってきました。

    2010年4月18日 9:04
  • 自己レスです。

    前回、解決したとの回答をしてしまったのですが、勘違いでした。

    DataBindingのTextを「なし」とすると、Comboboxのデータの選択はできるようになるのですが、保存をしようとすると
    「Nullは使用できない」
    とのエラーが出ます。

    DataBindingのTextの削除をしても、フォームを読み込み先頭のデータがフォームに表示されるので、データバインド
    されているように思えるのですが、違うのでしょうか。

    DataBindingの詳細にて、バインドしたいテーブルのフィールドを選択すると、Textも同時に登録がされます。

    Comboboxにて、Textの部分が入力された状態だと、Comboboxで候補を選択した時点で、操作不能になります。

    後は、どの部分を見ればよいでしょうか。

    フォームとメインで考えているテーブルとがバインドできていないのならば、フォームを読み込んだ時点で、データが表示されない
    はずと思うのですが、データが表示されてしまうのでよけいに悩んでしまいます。

    どうか、アドバイスお願いします。

    2010年4月20日 14:12
  • デザイナでComboBoxのプロパティを見ると、(DataBindings)という項目があると思います。そこでSelectedValueのみが保存したいテーブルのフィールドにバインドされていることを確認してみて下さい。、(DataBindings)にはTextプロパティもありますが、ここは(なし)で良いです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク TI-cb400 2010年4月27日 23:39
    2010年4月20日 15:02
    モデレータ
  • ご回答ありがとうございます。

    もともと、使用していたパソコンで再度テストをしたところ、エラーはなく、保存もしっかりとできました。

    今回、エラーが発生したのが自宅のパソコンだったので、もう少し原因を調べてみたいと思います。

    2010年4月20日 22:39
  • ご回答が大変遅くなりました。

    おかげさまでうまく動作するようになりました。
    本当にありがとうございました。

    2010年4月27日 23:39