c# - example - visual studio binding source




WinForms ComboBox liaison de données gotcha (2)

Supposons que vous faites quelque chose comme le suivant

List<string> myitems = new List<string>
{
    "Item 1",
    "Item 2",
    "Item 3"
};

ComboBox box = new ComboBox();
box.DataSource = myitems;

ComboBox box2 = new ComboBox();
box2.DataSource = myitems

Alors maintenant, nous avons 2 boîtes de liste déroulantes liées à ce tableau, et tout fonctionne bien. Mais lorsque vous modifiez la valeur d'une zone de liste déroulante, elle modifie les deux zones de liste déroulante à celle que vous venez de sélectionner.

Maintenant, je sais que les tableaux sont toujours passés par référence (appris que quand j'ai appris C: D), mais pourquoi les boîtes de combo changeraient-elles ensemble? Je ne crois pas que le contrôle de la combo modifie la collection du tout.

Comme un travail autour, ne serait-ce pas atteindre la fonctionnalité qui est attendue / désirée

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();

Cela a à voir avec la façon dont les liaisons de données sont configurées dans le framework dotnet, en particulier le BindingContext . À un niveau élevé, cela signifie que si vous n'avez pas spécifié autrement, chaque formulaire et tous les contrôles du formulaire partagent le même BindingContext . Lorsque vous définissez la propriété DataSource la ComboBox BindingContext utilisera BindingContext pour obtenir un ConcurrenyMangager qui encapsule la liste. Le ConcurrenyManager garde la trace de choses telles que la position sélectionnée actuelle dans la liste.

Lorsque vous définissez la DataSource de DataSource de la deuxième ComboBox BindingContext elle utilisera le même BindingContext (les formulaires) qui donnera une référence au même ConcurrencyManager que ci-dessus utilisé pour configurer les liaisons de données.

Pour obtenir une explication plus détaillée, voir BindingContext .


Cela pourrait être juste une faute de frappe, mais dans le code que vous avez fourni, vous ne faites référence qu'à la première zone de liste déroulante lors de la définition de la source de données:

ComboBox box = new ComboBox();
box.DataSource = myitems;

ComboBox box2 = new ComboBox();
**box**.DataSource = myitems

La source de données pour box2 n'est pas définie.







data-binding