item - valuemember combobox c#
El enlace de datos WinForms ComboBox tiene (3)
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();
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
El origen de datos para box2
no está configurado.
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 propiedad DataSource
, ComboBox
usará BindingContext
para obtener un ConcurrenyMangager
que envuelva la lista. ConcurrenyManager
realiza un seguimiento de cosas tales como la posición seleccionada actual en la lista.
Cuando configura el DataSource
del segundo ComboBox
, usará el mismo BindingContext
(los formularios) que dará como resultado una referencia al mismo ConcurrencyManager
que se utilizó anteriormente para configurar los enlaces de datos.
Para obtener una explicación más detallada, consulte BindingContext .
Una mejor solución (dependiendo del tamaño de la BindingSource
de datos) es declarar dos objetos BindingSource
(nuevos a partir de 2.00) enlazar 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.