トップ回答者
コンボボックスの項目について

質問
-
こんにちは、こちらのフォーラムはよく覗かせていただいております。
当方プログラミング初心者でコンボボックスについてわからないことがありましたので質問させていただきました。
[質問内容]
コンボボックスのプロパティからDataSourceを指定し、特定の項目(年度)をDisplayMemberにて読み込みコンボボックスに表示させたのですが、元のデータにおいて年度の項目は多数重複するため、重複するものを統一し表示したい。
[作業環境]
Visual Studio Express 2012 for Windows Desktop
問題の解決方法、ヒントなど教えていただける方、よろしくお願いします。
- 編集済み umeumeχ 2013年5月28日 1:39
回答
-
勘違いしていましたので、修正しています。
デザインビューでコンボボックスのプロパティからDBを紐付けされているのですね。
その場合は、DISTINCTなど使用できないと思われます。コードにてSQL文(DISTINCTで重複まとめる)を発行して、その結果をDataSourceに代入してやる必要があるかと思います。
または、元のDBのテーブルから重複行をまとめた別のテーブルを作成・更新して、その別のテーブルを現在の方法で使用する。(あまりスマートでない気もしますが・・・)
他に上手い方法があれば私も知りたいところです。
すべての返信
-
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/
-
勘違いしていましたので、修正しています。
デザインビューでコンボボックスのプロパティからDBを紐付けされているのですね。
その場合は、DISTINCTなど使用できないと思われます。コードにてSQL文(DISTINCTで重複まとめる)を発行して、その結果をDataSourceに代入してやる必要があるかと思います。
または、元のDBのテーブルから重複行をまとめた別のテーブルを作成・更新して、その別のテーブルを現在の方法で使用する。(あまりスマートでない気もしますが・・・)
他に上手い方法があれば私も知りたいところです。
-
返信が遅くなり申し訳ございません。
trapemiyaさん,ご指摘・参考ページありがとうございます。各機能におけるdatasourceをどうするか再度検討しなおしてみます。
kentahogaさん、改めてお礼申し上げます。説明が足りず申し訳ないです。上に書かれたことが、まさに教えていただきたかったことです。できるだけ組み込まれている機能を使い、簡便に実現できないかと考えておりますのでもう少しがんばってみます。
お二方とも貴重な時間をさいて頂き、ありがとうございました。
-
umeumeχ さま、kentahoga さま よろしく。
既に、回答が付いているのですが ... 。
コンボボックスはバインドせず、同アイテムをデータセットから取得してやれば如何ですか?
取得時に、IF Not Me.ComboBox1.Items.Contains(dtFieldValue) と条件式を入れて .Items.Add して行けば、重複排除できますね。
問題は、Items が変更される場合の対応です。
データセットやデータグリッドビューの更新のイベントハンドラで、変更を捕らえ、コンボボックスアイテムを更新してやります。- 編集済み ShiroYuki_Mot 2013年5月28日 12:49 ComboBox1.Items.Contains を具体的に