2012-01-04 29 views
5

Estoy desarrollando una pequeña aplicación de escritorio, y hay varias listas desplegables (combobox-es) en mi formulario. Completo una lista de cadenas, que se utilizará como fuente de datos para todas ellas. Aquí es ejemplo de mi clase Form.cs:Comportamiento extraño del control de cuadro combinado de Windows Forms

List<string> datasource = new List<string>(); 
datasource.Add("string 1"); 
datasource.Add("string 2"); 

Entonces me puse esta lista como una fuente de datos a varios cuadros combinados:

cmbDataType1.DataSource = datasource; 
cmbDataType2.DataSource = datasource; 

Todo esto ocurre en el mismo método, que se llama desde el formulario constructor. Aquí está la parte extraña: después de cambiar un valor seleccionado en uno de ellos, se establecerá el mismo valor en el otro. No hay eventos de SelectedIndexChange establecidos. Lo he echado a perder en alguna parte, pero no puedo poner mi dedo donde ...

+1

Aquí hay [un enlace a una publicación de blog] (http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/ binding-multiple-comboboxes-to-the-same-datasource.aspx) que habla de esto un poco. Se trata de vb.net, pero la descripción del comportamiento debe ser la misma en cualquier caso. –

+0

Realmente aclaró algunas cosas, gracias hombre. –

Respuesta

10

El comportamiento que ves es por diseño. Cuando vincula el mismo objeto como origen de datos para controles múltiples, todos los controles comparten la misma fuente de enlace.

Si asigna explícitamente una nueva fuente de unión a cada control, incluso durante el uso de la misma fuente de datos, todos los controles será unido y actuará independientes entre sí:

cmbDataType1.DataSource = new BindingSource(datasource, ""); 
cmbDataType2.DataSource = new BindingSource(datasource, ""); 
+0

Funciona muy bien, gracias. –

3

Dado que está vinculando a la misma exacta datasource que es el comportamiento esperado. Deseará cambiar su enlace para que sea un enlace OneWay o usar diferentes objetos si no desea que el elemento seleccionado cambie.

+0

Aún así es curioso. La fuente de datos es una lista de cadenas. ¿Cómo sabe el cuadro combinado 2 que el índice seleccionado cambió en el cuadro combinado 1? No hay forma de almacenar esa información en una lista. –

+0

Esa es la magia de enlazar a una fuente de datos. Cambiar el índice en combobox1 es lo que le dice a la fuente de datos que mueva su puntero interno, que a su vez activa el cambio en combobox2. –

+0

Estoy tratando de entrenar la implementación por mi propia curiosidad ... así que me imagino que envuelven la lista en una estructura de fuente de datos con los datos de bookeeping necesarios, cosas como "elemento actual". ¿Cómo combinarían ambos comboboxes el mismo contenedor? Supongo que ambos crearían uno cuando se configuraran sus respectivas propiedades 'DataSource', lo que significa que la comunicación no funcionaría. Interesante ... –

4

Usted debe establecer un nuevo BindingContext para el control antes de vincular el dataSource la próxima vez:

cmbDataType1.BindingContext = new BindingContext(); 
cmbDataType1.DataSource = datasource; 

cmbDataType2.BindingContext = new BindingContext(); 
cmbDataType2.DataSource = datasource; 
+0

¡Gracias por la respuesta rápida, funciona como un encanto! :RE –