winform valuemember item example displaymember aƱadir c# winforms data-binding

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.