web-dev-qa-db-fra.com

Comment lier une liste à une ComboBox?

Je souhaite connecter un BindingSource à une liste d'objets de classe, puis la valeur d'objets à une zone de liste déroulante.
Quelqu'un peut-il suggérer comment le faire?

public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }

    public Country()
    {
        Cities = new List<City>();
    }
}

est ma classe et je veux lier son champ name à un BindingSource qui pourrait ensuite être associé à un ComboBox

96
Mobin

Comme vous vous référez à une liste déroulante, je suppose que vous ne voulez pas utiliser la liaison de données bidirectionnelle (si tel est le cas, utilisez un BindingList)

public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }
    public Country(string _name)
    {
        Cities = new List<City>();
        Name = _name;
    }
}



List<Country> countries = new List<Country> { new Country("UK"), 
                                     new Country("Australia"), 
                                     new Country("France") };

bindingSource1.DataSource = countries;

comboBox1.DataSource = bindingSource1.DataSource;

comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Name";

Pour trouver le pays sélectionné dans la liste déroulante liée, vous devez faire quelque chose comme: Country country = (Country)comboBox1.SelectedItem;.

Si vous souhaitez que la zone de liste déroulante se mette à jour de manière dynamique, vous devez vous assurer que la structure de données que vous avez définie en tant que DataSource implémente IBindingList; une de ces structures est BindingList<T>.


Conseil: assurez-vous de lier la DisplayMember à une propriété de la classe et non à un champ public. Si votre classe utilise public string Name { get; set; }, elle fonctionnera mais si elle utilise public string Name;, elle ne pourra pas accéder à la valeur mais affichera le type d'objet pour chaque ligne de la liste déroulante.

145
Mitch Wheat

Pour un document d’information, il ya 2 façons d’utiliser un ComboBox/ListBox

1) Ajoutez des objets Pays à la propriété Items et récupérez un pays comme élément sélectionné. Pour utiliser cela, vous devez remplacer le ToString du pays.

2) Utilisez DataBinding, définissez la source de données sur un IList (List <>) et utilisez DisplayMember, ValueMember et SelectedValue

Pour 2) vous aurez d'abord besoin d'une liste de pays

// not tested, schematic:
List<Country> countries = ...;
...; // fill 

comboBox1.DataSource = countries;
comboBox1.DisplayMember="Name";
comboBox1.ValueMember="Cities";

Et puis dans le SelectionChanged,

if (comboBox1.Selecteditem != null)
{
   comboBox2.DataSource=comboBox1.SelectedValue;

}
24
Henk Holterman
public MainWindow(){
    List<person> personList = new List<person>();

    personList.Add(new person { name = "rob", age = 32 } );
    personList.Add(new person { name = "annie", age = 24 } );
    personList.Add(new person { name = "paul", age = 19 } );

    comboBox1.DataSource = personList;
    comboBox1.DisplayMember = "name";

    comboBox1.SelectionChanged += new SelectionChangedEventHandler(comboBox1_SelectionChanged);
}


void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    person selectedPerson = comboBox1.SelectedItem as person;
    messageBox.Show(selectedPerson.name, "caption goes here");
}

boom.

20
Robert Tonnessen

Essayez quelque chose comme ça:

yourControl.DataSource = countryInstance.Cities;

Et si vous utilisez WebForms, vous devrez ajouter cette ligne:

yourControl.DataBind();
0
Andrew Hare
public class Country
{
    public string Name { get; set; }
    public IList<City> Cities { get; set; }

    public Country()
    {
        Cities = new List<City>();
    }
}

public class City 
{
    public string Name { get; set; } 
}

List<Country> Countries = new List<Country>
{
    new Country
    {
        Name = "Germany",
        Cities =
        {
            new City {Name = "Berlin"},
            new City {Name = "Hamburg"}
        }
    },
    new Country
    {
        Name = "England",
        Cities =
        {
            new City {Name = "London"},
            new City {Name = "Birmingham"}
        }
    }
};
bindingSource1.DataSource = Countries;
member_CountryComboBox.DataSource = bindingSource1.DataSource;
member_CountryComboBox.DisplayMember = "Name";
member_CountryCombo

Box.ValueMember = "Name";

C'est le code que j'utilise maintenant.

0
Mobin