2011-02-01 14 views
11

¿Puedo preguntar por qué ambos cuadros combinados se disparan entre sí de modo que ambos tengan los mismos valores? ¿No puedo compartir una sola lista y tengo 2 cuadros combinados con diferente texto seleccionado?Compartir ComboBox DataSource

private void Form1_Load(object sender, EventArgs e) 
    { 
     BindingList<string> list = new BindingList<string>(); 
     list.Add("A"); 
     list.Add("B"); 
     list.Add("C"); 
     list.Add("D"); 

     bind(cbo1, list); 
     bind(cbo2, list); 
    } 

    private void bind(ComboBox combobox, BindingList<string> list) 
    { 
     // commented lines are in actual code, 
     // but appears unimportant in this question 
     //combobox.DropDownStyle = ComboBoxStyle.DropDown; 
     //combobox.AutoCompleteSource = AutoCompleteSource.ListItems; 
     //combobox.AutoCompleteMode = AutoCompleteMode.Suggest; 
     combobox.DataSource = list; 
     //combobox.Focus(); 
     //combobox.Text = string.Empty; 
     //combobox.SelectedText = string.Empty; 
    } 

ACTUALIZACIÓN: Ok, ahora me enteré de la cuestión es que el origen de datos es manejada por algunos BindingContext y CurrencyManager para sincronizar automáticamente la lista. Pero creo que alguien debe saber cómo desactivar este comportamiento.

No deseo utilizar 2 listas diferentes porque deseo poder modificar esta lista única en tiempo de ejecución y hacer que los cambios se reflejen en todos los ComboBoxes. Cualquier método para lograr esto sería muy apreciado.

+0

Bien, puedo confirmar esto. Puede (debería) simplificar 'bind()' para simplemente 'cbo1.DataSource = list;' –

+0

@Henk ¿cuál es la advertencia? – Jake

+0

No conozco la causa exacta, la simplificación es definir (restringir) mejor el problema. –

Respuesta

7

Usted puede "resolver" de esta manera:

// combobox.DataSource = list; 
var curr = new BindingSource(list, null);   
combobox.DataSource = curr; 

Hay un defecto BindingSource (currencyManager) vinculados a cada formulario que mantenía el 2 CBX en sincronía. Pero no estoy seguro de cuáles son las reglas exactas aquí. Ni siquiera estoy seguro de si lo anterior es una buena idea o no.

Para listas pequeñas solo haría copias separadas.

+0

Casi puedo golpear mi cabeza contra la pared. Sabes que me pediste que estableciera "cbo1.DataSource = list" y tuve esta línea en Form_Load mientras comían las llamadas bind(). así que cuando probé BindingSource dentro de bind(), no funcionó ... solo para agregar, en mi caso, no funcionará con la lista. BindingList es obligatorio. ¡Gracias! – Jake

0

No se puede usar el mismo objeto que el origen de datos para 2 cuadros combinados separados. Debe tener list1 y list2 definidos y completar cada cuadro combinado con cada uno. Usar el mismo origen de datos significa que una selección en un cuadro combinado se refleja en el otro.

+0

gracias por la información, déjame encontrar una solución a mi problema específico y volveré. – Jake

+1

Esto no tiene sentido, ¿verdad? El origen de datos es solo la lista de elementos, no contiene el elemento seleccionado. Entonces, ¿por qué el elemento seleccionado de un cuadro combinado debe determinar el elemento seleccionado de un cuadro combinado diferente utilizando el mismo origen de datos para los elementos de la lista ...? – TheBlastOne

+0

@TheBlastOne el origen de datos en este caso se refiere a los datos donde la lista OBTENDRÁ su lista de elementos desplegables. Entonces tiene sentido, o eso creo. El otro origen de datos se refiere a una ubicación de memoria donde la interfaz de usuario se actualizará cuando el usuario interactúe con ella. – Jake

Cuestiones relacionadas