WinForms ComboBox adatkötés Gotcha

szavazat
44

Tegyük fel, hogy csinál valamit, mint az alábbi

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

Tehát most van 2 kombinált dobozok kötve, hogy a tömb, és minden rendben. De ha a változó értéke egy combo box, megváltoztatja MINDKÉT kombinált dobozok, hogy az imént kiválasztott.

Most már tudom, hogy a tömbök mindig telt referenciaként (Megtanultam, hogy amikor megtudtam C: D), de mi a fenének lenne a kombinált dobozok együtt változik? Nem hiszem, hogy a combo box vezérlő módosítja a gyűjtemény egyáltalán.

Mivel a mű körül, nem ez lenne elérni a funkcionalitás, amely várhatóan / kívánt

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
A kérdést 02/08/2008 17:09
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
37

Ennek oka az, hogy hogyan adatkötések létre a DotNet keretet, különösen az BindingContext. Magas szinten ez azt jelenti, hogy ha másként nem jelezzük minden formáját és minden ellenőrzést a forma azonos BindingContext. Amikor beállítja az DataSourceingatlan az ComboBoxfogja használni az BindingContext, hogy egy ConcurrenyMangager, amely beburkolja a listán. A ConcurrenyManagernyilvántartja olyan dolgok, mint a jelenlegi kiválasztott pozíciót a listában.

Ha beállítja a DataSourcemásodik ComboBoxakkor használja ugyanazt a BindingContext(formák), amely így egy hivatkozás ugyanazon ConcurrencyManagera fenti beállításához használt az adatok kötések.

Ahhoz, hogy egy részletesebb magyarázatot lásd BindingContext .

Válaszolt 02/08/2008 18:18
a forrás felhasználó

szavazat
20

Egy jobb megoldás (attól függően, hogy a méret a datasource), hogy állapítsa meg a két BindingSourcetárgyat (új, mint a 2.00) kötődnek a gyűjtemény azoknak majd kötődik azokhoz a comboboxes.

Mellékelem teljes példát.

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

Ha azt szeretnénk, hogy megzavarja magát még mindig próbálja nyilvánító kötések a kivitelező. Amelyek eredményeként néhány igazán kíváncsi a hibákat, ezért mindig kötődnek a Load esemény.

Válaszolt 21/08/2008 15:48
a forrás felhasználó

szavazat
2

Ez lehet csak elírás, de a kódot feltéve, ha egyetlen utalás az első combo box beállításakor adatforrás:

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

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

Az adatforrás az box2nincs beállítva.

Válaszolt 21/08/2008 18:12
a forrás felhasználó

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