Vra

Gestel jy doen iets soos die volgende

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

So nou het ons 2 kombinasiebokse wat aan daardie skikking gebind is, en alles werk goed.Maar wanneer jy die waarde van een kombinasieboks verander, verander dit BEIDE kombinasiebokse na die een wat jy pas gekies het.

Nou weet ek dat skikkings altyd deur verwysing deurgegee word (het dit geleer toe ek C:D geleer het), maar hoekom op aarde sal die kombinasiebokse saam verander?Ek glo glad nie die kombinasieboksbeheer verander die versameling nie.

As 'n oplossing, sal dit nie die funksionaliteit bereik wat verwag/gewens word nie

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Was dit nuttig?

Oplossing

Dit het te doen met hoe databindings in die dotnet-raamwerk opgestel word, veral die BindingContext.Op 'n hoë vlak beteken dit dat as jy nie anders gespesifiseer het nie, deel elke vorm en al die kontroles van die vorm dieselfde BindingContext.Wanneer jy die DataSource eiendom die ComboBox sal die gebruik BindingContext om a te kry ConcurrenyMangager dit sluit die lys af.Die ConcurrenyManager hou tred met dinge soos die huidige geselekteerde posisie in die lys.

Wanneer jy die DataSource van die tweede ComboBox dit sal dieselfde gebruik BindingContext (die vorms) wat 'n verwysing daarna sal oplewer ConcurrencyManager soos hierbo gebruik om die databindings op te stel.

Om 'n meer gedetailleerde verduideliking te kry, sien Bindingkonteks.

Ander wenke

'n Beter oplossing (afhangende van die grootte van die databron) is om twee te verklaar BindingSource voorwerpe (nuut vanaf 2.00) bind die versameling aan daardie en bind dit dan aan die kombinasiebokse.

Ek sluit 'n volledige voorbeeld in.

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

As jy jouself nog meer wil verwar, probeer dan om altyd bindings in die konstruktor te verklaar.Dit kan sommige tot gevolg hê regtig nuuskierige foute, daarom bind ek altyd die Load-geleentheid in.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top