WinForms ComboBox vázání dat Gotcha

hlasů
44

Předpokládejme, že děláte něco jako následující

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

Takže teď máme 2 roletky vázané k tomuto poli, a vše funguje. Ale když změníte hodnotu jednoho pole se seznamem, změní OBĚ roletky na ta, kterou jste právě vybrali.

Teď vím, že Pole jsou vždy předány podle odkazu (zjistil, že když jsem se dozvěděl, C: D), ale proč proboha by comboboxů změnit dohromady? Nevěřím, že řídící pole se změnou sbírku vůbec.

Jako práce kolem, nedělej to by dosáhlo funcionality, který je očekáván / požadované

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Položena 02/08/2008 v 17:09
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
37

To má co do činění s tím, jak jsou datové vazby zřízené v rámci dotnet, zejména BindingContext. Na vysoké úrovni, to znamená, že pokud jste není uvedeno jinak, každý formulář a všechny ovládací prvky sdílené formuláře stejné BindingContext. Když nastavujete DataSourcemajetek, jehož ComboBoxbude používat BindingContextdostat ConcurrenyMangager, která obaluje seznamu. ConcurrenyManagerUdržuje takové věci, jako je aktuálně zvolené pozici v seznamu.

Při nastavení DataSourcez druhé ComboBoxbude používat stejné BindingContext(formy), které se získá odkaz na stejné ConcurrencyManagerjak je uvedeno výše používá pro nastavení datové vazby.

Chcete-li získat podrobnější vysvětlení viz BindingContext .

Odpovězeno 02/08/2008 v 18:18
zdroj uživatelem

hlasů
20

Lepší řešení (v závislosti na velikosti zdroj dat), je deklarovat dva BindingSourcepředměty (nové jako 2,00) se váží na sběr těm, a pak se vážou ty na ComboBoxes.

Přikládám kompletní příklad.

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

Pokud chcete zaměnit se ještě zkuste vždy deklarovat vazby v konstruktoru. Které může mít za následek některé opravdu kuriózních chyb, a proto jsem se vždy vážou události Load.

Odpovězeno 21/08/2008 v 15:48
zdroj uživatelem

hlasů
2

To by mohlo být jen překlep, ale v kódu, které jste poskytli odkazovat pouze první pole se seznamem při stanovení zdroj dat:

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

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

Zdroj dat pro box2není nastaven.

Odpovězeno 21/08/2008 v 18:12
zdroj uživatelem

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