UPDATE: Ceci est maintenant résolu, voir la réponse ci-dessous.
Sur l'un de mes formulaires (dans une application Windows Forms), j'ai 3 zones de liste déroulante. Ces listes déroulantes doivent afficher une liste de prix (en texte, avec une valeur d’arrière-plan entière).
Toutes ces listes déroulantes utilisent la même source de données (A List <> de type TSPrice, avec ValueMember défini sur Price et DisplayMember défini sur Description).
Mon problème est le suivant ... Chaque fois que je choisis une option de prix dans l’une des listes déroulantes, elles changent TOUT en ayant la même valeur ... Est-ce que cela a quelque chose à voir avec le fait qu’elles soient toutes liées à la même source de données?
Voici comment je les lie:
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;
Edit: Le problème était qu'ils étaient tous liés à la même source de données, comme l'a confirmé Saurabh. Voici comment je l'ai résolu.
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;
Je sais que vous ne l'avez pas demandé, mais puis-je vous suggérer de modifier un peu votre code 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());
vous pouvez probablement aussi essayer cette solution, il suffit d’attribuer un nouveau contexte à la deuxième zone de liste déroulante:
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";
Je vous remercie
Je ne vois pas pourquoi cela devrait être si difficile ... vous pouvez simplement les lier à des clones de la même source de données ... cela résout le problème. Tout ce que vous devez faire c'est
objInsuredPrice.DataSource = new List<TSPrice>(priceList);
objTPPrice.DataSource = new List<TSPrice>(priceList);
objProvSum.DataSource = new List<TSPrice>(priceList);
Incidemment, c’est exactement ce que fait le code de VVS.
Pourtant, un comportement étrange ... qui vient de doit être un bug, imo.
Oui, absolument, vous avez raison puisque vous vous associez à la même source. Par conséquent, la sélection de celle-ci sera appliquée au reste de la liste combox.
pour résoudre ce problème, vous devez supprimer manuellement l'autre gestionnaire de liste déroulante dans un événement slectedindex modifié, puis définir l'index sélectionné, puis à nouveau ajouter des gestionnaires à insérer dans le code. Voir ci-dessous.
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;
}
Beth Massi a écrit un article expliquant ce problème et la solution appropriée: https://blogs.msdn.Microsoft.com/bethmassi/2007/09/19/binding-multiple-combo-boxes-to -la-même-source-de-données/
Elle a également une série de vidéos sur la liaison de données auxquelles elle renvoie.
J'ai lu les réponses précédentes et peux confirmer que, malheureusement, aucune d'entre elles n'a fonctionné lorsque je les ai essayées.
Créer un nouveau BindingContext sur une liste déroulante semble juste le casser. Je suggère de faire ce que Beth explique: créez une nouvelle configuration de BindingSource.
Cela fonctionne pour moi et je n'ai pas besoin de copier le source.
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();