2012-01-04 9 views
5

私は小さなデスクトップアプリケーションを開発しており、フォームには複数のドロップダウンリスト(コンボボックス)があります。私はそれらのすべてのデータソースとして使用される文字列のリストを作成します。ここに私のForm.csクラスからの例です:Windowsフォームコンボボックスコントロールの奇妙な動作

List<string> datasource = new List<string>(); 
datasource.Add("string 1"); 
datasource.Add("string 2"); 

その後、私はいくつかのコンボボックスにデータソースとしてこのリストを設定します。

cmbDataType1.DataSource = datasource; 
cmbDataType2.DataSource = datasource; 

これはすべてのフォームから呼び出されたのと同じ方法で起こりますコンストラクタ。 奇妙な部分があります:私はそれらのうちの1つで選択された値を変更した後、同じ値が別の値に設定されます。 SelectedIndexChangeイベントは設定されていません。私はどこかでうんざりしていますが、私は指を入れません。

+1

[ブログの投稿へのリンク](http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/)は次のときにデータソースをバインドする前の制御用です。 binding-multiple-comboboxes-to-the-same-datasource.aspx)を参照してください。それはvb.netについてですが、動作の説明はいずれの方法でも同じでなければなりません。 –

+0

本当にいくつかの事を明確にしました。 –

答えて

10

表示される動作は仕様です。複数のコントロールのデータソースと同じオブジェクトをバインドすると、すべてのコントロールが同じバインディングソースを共有します。

明示的にも、同じデータソースを使用している間、すべてのコントロールが結合していないだろうと、互いに独立して行動する、各コントロールに新しいバインディングソースを割り当てた場合:

cmbDataType1.DataSource = new BindingSource(datasource, ""); 
cmbDataType2.DataSource = new BindingSource(datasource, ""); 
+0

素晴らしい、ありがとう。 –

3

予想通りの正確なdatasourceにバインドしているので、バインドをOneWayバインディングに変更するか、選択した項目を変更したくない場合は別のオブジェクトを使用することをお勧めします。

+0

それはまだ不思議です。データソースは文字列のリストです。コンボボックス2では、選択したインデックスがコンボボックス1で変更されたことをどのように知っていますか?その情報をリストに格納する方法はありません。 –

+0

これはデータソースへのバインディングの魔法です。 combobox1のインデックスを変更すると、データソースに内部ポインタを移動させ、次にcombobox2の変更をトリガします。 –

+0

私は自分の好奇心のための実装を試してみようと思っています...だから、私は彼らがデータアイテム構造の中でリストを "現在のアイテム"のような必要なデータを必要とするものにすると想像します。どちらのコンボボックスにも同じラッパーへの参照がありますか?私は、それぞれの 'DataSource'プロパティが設定されているときに両方を作成すると仮定します。これは、通信がうまくいかないことを意味します。面白い... –

4

あなたは新しいBindingContextを設定する必要があります

cmbDataType1.BindingContext = new BindingContext(); 
cmbDataType1.DataSource = datasource; 

cmbDataType2.BindingContext = new BindingContext(); 
cmbDataType2.DataSource = datasource; 
+0

素早い返信をありがとうございます、それは魅力のように動作します! :D –