web-dev-qa-db-fra.com

Plusieurs listes déroulantes avec la même source de données (C #)


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;
23
Tom Glenn

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());
5
VVS

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

63
IMR

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.

13
Nyerguds

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;
    }
2
TalentTuner

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.

1
ldobson

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();
0
Ismael Cruz