WinForms données ComboBox liaison à Gotcha

voix
44

Supposons que vous faites quelque chose comme ce qui suit

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

Nous avons donc maintenant 2 boîtes combo liés à ce tableau, et tout fonctionne bien. Mais lorsque vous modifiez la valeur d'une zone de liste déroulante, il change les deux boîtes combo à celui que vous venez de sélectionner.

Maintenant, je sais que les tableaux sont toujours passés par référence (appris que lorsque j'ai appris C: D), mais pourquoi diable les boîtes combo changer ensemble? Je ne crois pas que le contrôle de la zone de liste déroulante est en train de modifier la collection du tout.

En tant que travail autour, ne pas accomplirait la fonctionalité qui devrait / désirée

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Créé 02/08/2008 à 17:09
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
37

Cela a à voir avec la façon dont les liaisons de données sont mis en place dans le cadre de dotnet, en particulier le BindingContext. Sur un niveau élevé , cela signifie que si vous ne l' avez pas autrement spécifié chaque forme et tous les contrôles de la forme partagent le même BindingContext. Lorsque vous définissez la DataSourcepropriété la ComboBoxutilisera la BindingContextpour obtenir un ConcurrenyMangagerqui enveloppe la liste. La ConcurrenyManagergarde la trace de choses telles que la position actuelle sélectionnée dans la liste.

Lorsque vous définissez la DataSourcede la seconde , ComboBoxil utilisera les mêmes BindingContext(les formes) qui donnera une référence au même ConcurrencyManagerque ci - dessus utilisé pour configurer les liaisons de données.

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

Créé 02/08/2008 à 18:18
source utilisateur

voix
20

Une meilleure solution ( en fonction de la taille de la source de données) est de déclarer deux BindingSourceobjets (nouveaux à partir de 2,00) se lient à la collection ceux -ci et ensuite lier ceux des comboboxes.

Je joins un exemple complet.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private BindingSource source1 = new BindingSource();
        private BindingSource source2 = new BindingSource();

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1Load);
        }

        void Form1Load(object sender, EventArgs e)
        {
            List<string> myitems = new List<string>
            {
                "Item 1",
                "Item 2",
                "Item 3"
            };

            ComboBox box = new ComboBox();
            box.Bounds = new Rectangle(10, 10, 100, 50);
            source1.DataSource = myitems;
            box.DataSource = source1;

            ComboBox box2 = new ComboBox();
            box2.Bounds = new Rectangle(10, 80, 100, 50);
            source2.DataSource = myitems;
            box2.DataSource = source2;

            Controls.Add(box);
            Controls.Add(box2);
        }
    }
}

Si vous voulez vous confondre essayer encore plus de toujours déclarer les liaisons dans le constructeur. Cela peut donner lieu à des vraiment insectes curieux, d' où je lie toujours en cas de charge.

Créé 21/08/2008 à 15:48
source utilisateur

voix
2

Cela pourrait être juste une faute de frappe, mais dans le code qui vous est fourni uniquement référence à la première zone de liste déroulante lors du réglage du point d'émission:

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

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

La source de données pour box2n'est pas réglé.

Créé 21/08/2008 à 18:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more