none
コンボボックスの項目について RRS feed

  • 質問

  • こんにちは、こちらのフォーラムはよく覗かせていただいております。

    当方プログラミング初心者でコンボボックスについてわからないことがありましたので質問させていただきました。

    [質問内容]

    コンボボックスのプロパティからDataSourceを指定し、特定の項目(年度)をDisplayMemberにて読み込みコンボボックスに表示させたのですが、元のデータにおいて年度の項目は多数重複するため、重複するものを統一し表示したい。

    [作業環境]

    Visual Studio Express 2012 for Windows Desktop

    問題の解決方法、ヒントなど教えていただける方、よろしくお願いします。


    • 編集済み umeumeχ 2013年5月28日 1:39
    2013年5月28日 1:32

回答

  • 勘違いしていましたので、修正しています。

    デザインビューでコンボボックスのプロパティからDBを紐付けされているのですね。

    その場合は、DISTINCTなど使用できないと思われます。コードにてSQL文(DISTINCTで重複まとめる)を発行して、その結果をDataSourceに代入してやる必要があるかと思います。

    または、元のDBのテーブルから重複行をまとめた別のテーブルを作成・更新して、その別のテーブルを現在の方法で使用する。(あまりスマートでない気もしますが・・・)

    他に上手い方法があれば私も知りたいところです。

    • 編集済み kentahoga 2013年5月28日 5:03 追記
    • 回答としてマーク umeumeχ 2013年5月28日 7:50
    2013年5月28日 4:29

すべての返信

  • 元のデータはどのように取得してきているのでしょうか?

    DBから取得してきているのであれば、DISTINCTで重複項目をまとめて取得してくれば良いのではないでしょうか。

    他の場合でも、あらかじめデータ取得時に重複項目をまとめておくと良いと思います。

    2013年5月28日 1:55
  • kentahogaさん、早速の書き込みありがとうございます。

    元のデータは、おっしゃる通りDBから取得したものです。”DISTINCTで重複項目をまとめて取得"とはDataSourceをコンボボックスのプロパティで指定した場合でも可能なのでしょうか?

    質問ばかりで申し訳ないです。

    2013年5月28日 2:21
  • kentahogaさんが書かれているように、どのようにデータを取得するかに関わってきます。データベースから取得する場合、厳密に言えば、元のデータとは別にComboboxのDataSource専用にデータを取得する場合、両者の整合性が崩れないように気を付けなければならない場合があります。例えば、元のデータを抽出した時には2012年度があったのに、ComboboxのDataSource専用にデータを抜くまでのわずかな間に2012年度が削除されてしまった場合などです。もちろん、スタンドアロンの場合は一般的にこのような考慮をする必要はありません。
    データベースからComboboxのDataSource専用にデータを取得する以外の方法としては、元のデータからLINQやDataViewのToTableメソッドを利用して、ComboboxのDataSource用にデータを用意する方法があります。以下にサンプルがまとまっていますので、参考になると思います。

    LINQ to DataTable のDistinct を検証してみた
    http://pub.ne.jp/rf_app/?entry_id=2723462


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年5月28日 2:42
    モデレータ
  • 勘違いしていましたので、修正しています。

    デザインビューでコンボボックスのプロパティからDBを紐付けされているのですね。

    その場合は、DISTINCTなど使用できないと思われます。コードにてSQL文(DISTINCTで重複まとめる)を発行して、その結果をDataSourceに代入してやる必要があるかと思います。

    または、元のDBのテーブルから重複行をまとめた別のテーブルを作成・更新して、その別のテーブルを現在の方法で使用する。(あまりスマートでない気もしますが・・・)

    他に上手い方法があれば私も知りたいところです。

    • 編集済み kentahoga 2013年5月28日 5:03 追記
    • 回答としてマーク umeumeχ 2013年5月28日 7:50
    2013年5月28日 4:29
  • 返信が遅くなり申し訳ございません。

    trapemiyaさん,ご指摘・参考ページありがとうございます。各機能におけるdatasourceをどうするか再度検討しなおしてみます。

    kentahogaさん、改めてお礼申し上げます。説明が足りず申し訳ないです。上に書かれたことが、まさに教えていただきたかったことです。できるだけ組み込まれている機能を使い、簡便に実現できないかと考えておりますのでもう少しがんばってみます。

    お二方とも貴重な時間をさいて頂き、ありがとうございました。

    • 回答としてマーク umeumeχ 2013年5月28日 6:35
    • 回答としてマークされていない umeumeχ 2013年5月28日 7:50
    2013年5月28日 6:35
  • umeumeχ さま、kentahoga さま よろしく。

    既に、回答が付いているのですが ... 。

    コンボボックスはバインドせず、同アイテムをデータセットから取得してやれば如何ですか?
    取得時に、IF Not Me.ComboBox1.Items.Contains(dtFieldValue) と条件式を入れて .Items.Add して行けば、重複排除できますね。
    問題は、Items が変更される場合の対応です。
    データセットやデータグリッドビューの更新のイベントハンドラで、変更を捕らえ、コンボボックスアイテムを更新してやります。

    • 編集済み ShiroYuki_Mot 2013年5月28日 12:49 ComboBox1.Items.Contains を具体的に
    2013年5月28日 10:12