Pergunta

Suponha que você esteja fazendo algo como o seguinte

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

Então agora temos 2 caixas de combinação vinculadas a esse array e tudo funciona bem.Mas quando você altera o valor de uma caixa de combinação, ambas as caixas de combinação são alteradas para aquela que você acabou de selecionar.

Agora, eu sei que Arrays são sempre passados ​​​​por referência (aprendi isso quando aprendi C: D), mas por que diabos as caixas de combinação mudariam juntas?Não acredito que o controle da caixa de combinação esteja modificando a coleção.

Como solução alternativa, isso não alcançaria a funcionalidade esperada/desejada

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Foi útil?

Solução

Isso tem a ver com a forma como as ligações de dados são configuradas na estrutura dotnet, especialmente no BindingContext.Em um nível alto, significa que se você não especificou o contrário, cada formulário e todos os controles do formulário compartilham o mesmo BindingContext.Quando você está configurando o DataSource propriedade o ComboBox usará o BindingContext para obter um ConcurrenyMangager isso encerra a lista.O ConcurrenyManager mantém registro de coisas como a posição atualmente selecionada na lista.

Quando você define o DataSource do segundo ComboBox ele usará o mesmo BindingContext (os formulários) que produzirão uma referência ao mesmo ConcurrencyManager como acima, usado para configurar as ligações de dados.

Para obter uma explicação mais detalhada, consulte BindingContext.

Outras dicas

Uma solução alternativa melhor (dependendo do tamanho da fonte de dados) é declarar dois BindingSource objetos (novos a partir de 2.00) vinculam a coleção a eles e depois vinculam-nos às caixas de combinação.

Anexo um exemplo 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 você quiser se confundir ainda mais, tente sempre declarar vinculações no construtor.Isso pode resultar em alguns realmente bugs curiosos, por isso sempre ligo no evento Load.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top