2012-01-04 2 views
5

Je développe une petite application de bureau, et il y a plusieurs listes déroulantes (combobox-es) sur mon formulaire. Je remplis une liste de chaînes, qui seront utilisées comme source de données pour chacune d'entre elles. Voici exemple de ma classe Form.cs:Comportement étrange du contrôle de Windows combobox

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

Ensuite, je mets cette liste comme une source de données à plusieurs comboboxes:

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

Tout cela se passe dans la même méthode, qui est appelée à partir du formulaire constructeur. Voici la partie étrange: après avoir changé une valeur sélectionnée dans l'un d'entre eux, la même valeur sera définie dans l'autre. Aucun jeu d'événements SelectedIndexChange n'est défini. J'ai foiré quelque part, mais je ne peux pas mettre mon doigt où ...

+1

est ici [un lien vers un blog] (http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/ binding-multiple-comboboxes-to-the-same-datasource.aspx) qui en parle un peu. Il s'agit de vb.net, mais la description du comportement devrait être la même dans les deux cas. –

+0

Il a vraiment clarifié certaines choses, merci l'homme. –

Répondre

10

Le comportement que vous voyez est voulu par la conception. Lorsque vous liez le même objet que la source de données pour plusieurs contrôles, tous les contrôles partagent la même source de liaison.

Si vous attribuez explicitement une nouvelle source de liaison à chaque contrôle, même en utilisant la même source de données, tous les contrôles seront non liés et agira indépendamment l'un de l'autre:

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

Fonctionne très bien, merci. –

3

Depuis que vous liez à la même exacte datasource qui est le comportement attendu. Vous souhaiterez modifier votre liaison en tant que liaison OneWay ou utiliser des objets différents si vous ne souhaitez pas que l'élément sélectionné change.

+0

C'est quand même curieux. La source de données est une liste de chaînes. Comment la zone de liste 2 sait-elle que l'index sélectionné a changé dans la zone de liste déroulante 1? Il n'y a aucun moyen de stocker cette information dans une liste. –

+0

C'est juste la magie de la liaison à une source de données. Changer l'index dans combobox1 est ce qui a dit à la source de données de déplacer son pointeur interne qui à son tour déclenche le changement dans combobox2. –

+0

J'essaie juste de mettre en œuvre l'implémentation pour ma propre curiosité ... alors j'imagine qu'ils enveloppent la liste dans une structure de source de données avec les données de bookkeeping nécessaires, des choses comme "item courant". Comment les deux combobox ont-ils une référence au même wrapper? Je suppose qu'ils en créeraient tous deux un quand leurs propriétés 'DataSource' respectives seraient définies, ce qui signifierait que la communication ne fonctionnerait pas. Intéressant ... –

4

Vous devez définir une nouvelle BindingContext pour le contrôle avant de se lier dataSource la prochaine fois:

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

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

Merci pour la réponse rapide, cela fonctionne comme un charme! :RÉ –