WinForms ComboBoxen data bindende fikser

stemmer
45

Anta at du gjør noe som følgende

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

Så nå har vi 2 kombinasjonsbokser bundet til denne matrisen, og alt fungerer fint. Men når du endrer verdien av en kombinasjonsboks, endrer det både kombinasjonsbokser til den du valgte.

Nå vet jeg at Arrays er alltid gått med referanse (lært at når jeg lærte C: D), men hvorfor i all verden skulle kombinasjonsboksene endre sammen? Jeg tror ikke kombinasjonsbokskontroll er å endre samlingen i det hele tatt.

Som et arbeid rundt, ikke dette ville oppnå den funksjonaliteten som er forventet / ønsket

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Publisert på 02/08/2008 klokken 16:09
kilden bruker
På andre språk...                            


3 svar

stemmer
38

Dette har å gjøre med hvordan data bindingene er satt opp i DotNet rammeverk, spesielt BindingContext. På et høyt nivå betyr det at hvis du ikke har noe annet er oppgitt hver form, og alle kontrollene i skjemaet deler den samme BindingContext. Når du setter på DataSourceeiendommen ComboBoxskal bruke BindingContextfor å få en ConcurrenyMangagersom brytes listen. Den ConcurrenyManagerholder styr på slike ting som den nåværende valgte posisjonen i listen.

Når man setter DataSourcetil den andre ComboBoxvil det å bruke de samme BindingContext(formene) som vil gi en referanse til det samme ConcurrencyManagersom ovenfor, brukt til å sette opp data bindinger.

For å få en mer detaljert forklaring se BindingContext .

Svarte 02/08/2008 kl. 17:18
kilden bruker

stemmer
20

En bedre løsning (avhengig av størrelsen av datakilden) er å erklære to BindingSourceobjekter (ny fra 2,00) binder samlingen til disse, og deretter bindes de til comboboxes.

Jeg legger ved en fullstendig eksempel.

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

Hvis du ønsker å forvirre deg enda mer så prøver alltid å erklære bindinger i konstruktøren. Som kan resultere i noen virkelig nysgjerrige bugs, derfor jeg alltid binde i Load hendelsen.

Svarte 21/08/2008 kl. 14:48
kilden bruker

stemmer
2

Dette kan være bare en skrivefeil, men i koden du forutsatt at du bare referere den første kombinasjonsboksen når du setter datakilden:

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

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

Datakilden for box2er ikke satt.

Svarte 21/08/2008 kl. 17:12
kilden bruker

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