Domanda

Si supponga che si sta facendo qualcosa di simile al seguente

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

Così ora abbiamo 2 caselle combinate associato alla matrice, e tutto funziona bene.Ma quando si cambia il valore di una casella combinata, cambia ENTRAMBE le caselle combinate a quello che hai appena selezionato.

Ora, so che le Matrici sono sempre passati per riferimento (imparato che quando ho imparato C :D), ma perché sulla terra sarebbe caselle combinate di cambiare insieme?Non credo che il controllo casella combinata è di modificare la raccolta a tutti.

Come soluzione alternativa, non ciò avrebbe consentito di raggiungere la funzionalità che è previsto/desiderato

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
È stato utile?

Soluzione

Questo ha a che fare con le associazioni di dati sono impostati in dotnet framework, in particolare il BindingContext.Su un livello alto significa che se non specificato diversamente, ogni forma e tutti i controlli del form di condividere la stessa BindingContext.Quando si imposta l' DataSource proprietà il ComboBox utilizzare il BindingContext per ottenere un ConcurrenyMangager che avvolge l'elenco.Il ConcurrenyManager tiene traccia di cose come l'attuale posizione selezionata nell'elenco.

Quando si imposta la DataSource del secondo ComboBox si utilizzerà lo stesso BindingContext (le forme), che restituisce un riferimento alla stessa ConcurrencyManager come in precedenza utilizzato per impostare le associazioni di dati.

Per ottenere una spiegazione più dettagliata vedere BindingContext.

Altri suggerimenti

Una migliore soluzione (a seconda delle dimensioni del datasource) è quello di dichiarare due BindingSource gli oggetti (di 2.00) associare la raccolta di questi e poi si legano a quelli per la combobox.

Allego un esempio completo.

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);
        }
    }
}

Se si vuole confondere se stessi ancora di più quindi si tenta di dichiarare sempre attacchi del costruttore.Che può causare alcuni davvero curioso bug, quindi ho sempre associare nell'evento Load.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top