Comment lier une liste à une ComboBox?
-
03-07-2019 - |
Question
Je souhaite connecter un BindingSource
à une liste d'objets de classe, puis une 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 souhaite lier son champ name
à un BindingSource qui pourrait ensuite être associé à un ComboBox
La solution
Comme vous faites référence à 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 associée, procédez comme suit: Country country = (Country)comboBox1.SelectedItem;
.
Si vous souhaitez que la ComboBox se mette à jour de manière dynamique, vous devez vous assurer que la structure de données que vous avez définie comme DataSource
implémente IBindingList
; une de ces structures est BindingList<T>
.
Conseil: assurez-vous que vous liez DisplayMember
à une propriété de la classe et non à un champ public. Si votre classe utilise public string Name { get; set; }
cela fonctionnera mais s'il utilisera public string Name;
, il ne pourra pas accéder à la valeur mais affichera à la place le type d'objet pour chaque ligne de la liste déroulante.
Autres conseils
Pour un document d’information, il existe 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 DataSource sur un IList (Liste < >) 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 ensuite dans SelectionChanged,
if (comboBox1.Selecteditem != null)
{
comboBox2.DataSource=comboBox1.SelectedValue;
}
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");
}
boum.
Essayez quelque chose comme ça:
yourControl.DataSource = countryInstance.Cities;
Et si vous utilisez WebForms, vous devrez ajouter cette ligne:
yourControl.DataBind();
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.
Si vous utilisez un ToolStripComboBox, aucune source de données n'est exposée (.NET 4.0):
List<string> someList = new List<string>();
someList.Add("value");
someList.Add("value");
someList.Add("value");
toolStripComboBox1.Items.AddRange(someList.ToArray());