winform llenar item c# winforms combobox datasource

c# - llenar - winform combobox



Varios cuadros combinados con la misma fuente de datos(C#) (6)

Beth Massi ha escrito un artículo que explica este problema y la solución correcta: https://blogs.msdn.microsoft.com/bethmassi/2007/09/19/binding-multiple-combo-boxes-to-the-same-data-source/

Ella tiene una serie de otros videos en Databinding que también vincula.

He leído las respuestas anteriores y puedo confirmar que, lamentablemente, ninguna de ellas funcionó cuando las probé.

La creación de un nuevo BindingContext en un cuadro combinado parece simplemente romperlo. Sugiero hacer lo que Beth explica: haga una configuración BindingSource completamente nueva.

ACTUALIZACIÓN: Esto ahora está resuelto, vea la respuesta a continuación.

En uno de mis formularios (en una aplicación de Windows Forms) tengo 3 cuadros combinados. Estos cuadros combinados deben mostrar una lista de precios (en texto, con un valor de back-end entero).

Todos estos cuadros combinados utilizan el mismo origen de datos (una lista <> de tipo TSPrice, con ValueMember configurado en Precio y DisplayMember configurado en Descripción).

Mi problema es este ... Cada vez que elijo una opción de precio de uno de los menús desplegables, TODOS cambian al mismo valor ... ¿Esto tiene algo que ver con todos ellos vinculados a la misma fuente de datos?

Así es como los estoy atando:

var priceList = new List<TSPrice> { new TSPrice(0, ""), new TSPrice(0, "Half Day"), new TSPrice(0, "Full Day"), new TSPrice(0, "1 + Half"), new TSPrice(0, "2 Days"), new TSPrice(0, "Formal Quote Required") }; objInsuredPrice.DataSource = priceList; objTPPrice.DataSource = priceList; objProvSum.DataSource = priceList; objInsuredPrice.ValueMember = "Price"; objTPPrice.ValueMember = "Price"; objProvSum.ValueMember = "Price"; objInsuredPrice.DisplayMember = "Description"; objTPPrice.DisplayMember = "Description"; objProvSum.DisplayMember = "Description"; objInsuredPrice.SelectedIndex = 0; objTPPrice.SelectedIndex = 0; objProvSum.SelectedIndex = 0; //objInsuredPrice.DataSource = objTPPrice.DataSource = objProvSum.DataSource = priceList; //objInsuredPrice.ValueMember = objTPPrice.ValueMember = objProvSum.ValueMember = "Price"; //objInsuredPrice.DisplayMember = objTPPrice.DisplayMember = objProvSum.DisplayMember = "Description"; //objInsuredPrice.SelectedIndex = objTPPrice.SelectedIndex = objProvSum.SelectedIndex = 0;

Edición: el problema era que todos estaban vinculados a la misma fuente de datos confirmada por Saurabh. Así lo resolví.

var priceList = new List<TSPrice> { new TSPrice(0, ""), new TSPrice(1, "Half Day"), new TSPrice(2, "Full Day"), new TSPrice(3, "1 + Half"), new TSPrice(4, "2 Days"), new TSPrice(5, "Formal Quote Required") }; var insuredList = new TSPrice[5]; var TPList = new TSPrice[5]; var provList = new TSPrice[5]; priceList.CopyTo(insuredList); priceList.CopyTo(TPList); priceList.CopyTo(provList); objInsuredPrice.DataSource = insuredList; objTPPrice.DataSource = TPList; objProvSum.DataSource = provList; objInsuredPrice.ValueMember = objTPPrice.ValueMember = objProvSum.ValueMember = "Price"; objInsuredPrice.DisplayMember = objTPPrice.DisplayMember = objProvSum.DisplayMember = "Description"; objInsuredPrice.SelectedIndex = objTPPrice.SelectedIndex = objProvSum.SelectedIndex = 0;


Esto funciona para mí y no necesito copiar la fuente.

List<string> days = GetDays(); List<string> months = GetMonths(); List<string> years = GetYears(); Son1DDLDay.DataSource = days; Son1DDLDay.DataBind(); Son1DDLMonth.DataSource = months; Son1DDLMonth.DataBind(); Son1DDLYear.DataSource = years; Son1DDLYear.DataBind(); Son2DDLDay.DataSource = days; Son2DDLDay.DataBind(); Son2DDLMonth.DataSource = months; Son2DDLMonth.DataBind(); Son2DDLYear.DataSource = years; Son2DDLYear.DataBind();


No veo por qué esto debería ser tan difícil ... simplemente puede vincularlos a clones de la misma fuente de datos ... que resuelve el problema. Todo lo que necesitas hacer es

objInsuredPrice.DataSource = new List<TSPrice>(priceList); objTPPrice.DataSource = new List<TSPrice>(priceList); objProvSum.DataSource = new List<TSPrice>(priceList);

Por cierto, esto es exactamente lo que hace el código de VVS.

Aún así, comportamiento extraño ... eso solo tiene que ser un error, imo.


Probablemente también podrías probar esta solución, simplemente asigna un nuevo Contexto al segundo cuadro combinado:

combobox1.DataSource = results; combobox1.DisplayMember = "DisplayValue"; combobox1.ValueMember = "Value"; combobox2.BindingContext = new BindingContext(); //create a new context combobox2.DataSource = results; combobox2.DisplayMember = "DisplayValue"; combobox2.ValueMember = "Value";

Gracias


Sé que no lo pediste, pero puedo sugerirte que refactorices un poco tu código final :-)

private List<TSPrice> GetPriceList() { return new List<TSPrice> { new TSPrice(0, ""), new TSPrice(0, "Half Day"), new TSPrice(0, "Full Day"), new TSPrice(0, "1 + Half"), new TSPrice(0, "2 Days"), new TSPrice(0, "Formal Quote Required") }; } private void BindPriceList(ComboBox comboBox, List<TSPrice> priceList) { comboBox.DataSource = priceList(); comboBox.ValueMember = "Price"; comboBox.DisplayMember = "Description"; comboBox.SelectedIndex = 0; } BindPriceList(objInsuredPrice, GetPriceList()); BindPriceList(objTPPrice, GetPriceList()); BindPriceList(objProvSum, GetPriceList());


Sí, es absolutamente correcto, ya que está vinculado a la misma fuente, por lo que la selección en una se aplicará al resto del combox

para superar este problema, debe eliminar manualmente el otro controlador de combobox en un evento slectedindex cambiado, luego configurar el índice seleccionado y luego agregar nuevamente los controladores para poner el código, solo vea a continuación

ComboBox c1 = new ComboBox(); ComboBox c2 = new ComboBox(); c1.SelectedIndexChanged += new EventHandler(c1_SelectedIndexChanged); c2.SelectedIndexChanged += new EventHandler(c2_SelectedIndexChanged); void c2_SelectedIndexChanged(object sender, EventArgs e) { c1.SelectedIndexChanged -= c1_SelectedIndexChanged; c2.SelectedIndex = 2; c1.SelectedIndexChanged += c1_SelectedIndexChanged; } void c1_SelectedIndexChanged(object sender, EventArgs e) { c2.SelectedIndexChanged -= c2_SelectedIndexChanged; c1.SelectedIndex = 2; c2.SelectedIndexChanged += c2_SelectedIndexChanged; }