Aquí podría ser tu PUBLICIDAD


El enlace de datos WinForms ComboBox tiene

votos
44

Supongamos que está haciendo algo como lo siguiente

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

Así que ahora tenemos 2 cuadros combinados vinculados a esa matriz, y todo funciona bien. Pero cuando cambia el valor de un cuadro combinado, cambia AMBOS cuadros combinados al que acaba de seleccionar.

Ahora, sé que las matrices siempre se pasan por referencia (aprendí eso cuando aprendí C: D), pero ¿por qué en la tierra cambiarían los cuadros combinados? No creo que el control del cuadro combinado modifique la colección.

Como solución alternativa, ¿no lograría esto la funcionalidad que se espera / desea?

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Publicado el 02/08/2008 a las 17:09
fuente por usuario Darren Kopp
En otros idiomas...        العربية       

3 respuestas

votos
37

Esto tiene que ver con cómo se configuran los enlaces de datos en el marco de dotnet, especialmente el BindingContext. En un nivel alto, significa que si no ha especificado lo contrario, cada formulario y todos los controles del formulario comparten el mismo BindingContext. Cuando establezca la DataSourcepropiedad, la ComboBoxusará BindingContextpara obtener una ConcurrenyMangagerque envuelva la lista. El ConcurrenyManagerseguimiento de cosas tales como la posición seleccionada actual en la lista.

Cuando establece el DataSourcesegundo ComboBox, usará el mismo BindingContext(los formularios), lo que dará como resultado una referencia al mismo ConcurrencyManagerque se utilizó anteriormente para configurar los enlaces de datos.

Para obtener una explicación más detallada, consulte BindingContext .

Respondida el 02/08/2008 a las 06:18
fuente por usuario Robert Höglund


Aquí podría ser tu PUBLICIDAD


votos
20

Una mejor solución (dependiendo del tamaño de la fuente de datos) es declarar dos BindingSourceobjetos (nuevos a partir de 2.00) vincular la colección a esos y luego vincularlos a los cuadros combinados.

Adjunto un ejemplo 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);
        }
    }
}

Si quiere confundirse aún más, intente siempre declarar enlaces en el constructor. Eso puede dar lugar a algunos errores muy curiosos, por lo tanto, siempre se unen en el evento de carga.

Respondida el 21/08/2008 a las 03:48
fuente por usuario Quibblesome

votos
2

Esto podría ser solo un error tipográfico, pero en el código que proporcionó solo hace referencia al primer cuadro combinado al configurar el origen de datos:

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

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

La fuente de datos para box2no está establecida.

Respondida el 21/08/2008 a las 06:12
fuente por usuario TheEmirOfGroofunkistan