Comment lier une liste à un ComboBox?

107

Je veux connecter un BindingSourceà une liste d'objets de classe, puis une valeur d'objets à un ComboBox.
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 namechamp à un BindingSource qui pourrait alors être associé à un ComboBox

Mobin
la source
Winforms ce que je veux, c'est m'aider à connecter les valeurs de données dans le champ des noms de l'objet pays reste, je vais le comprendre
Mobin

Réponses:

160

Comme vous faites référence à une zone de liste déroulante, je suppose que vous ne voulez pas utiliser la liaison de données bidirectionnelle (si c'est le cas, regardez à l'aide de a 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") };

var bindingSource1 = new BindingSource();
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é, vous feriez quelque chose comme: Country country = (Country)comboBox1.SelectedItem;.

Si vous souhaitez que la zone de liste déroulante se mette à jour dynamiquement, vous devez vous assurer que la structure de données que vous avez définie comme DataSourceimplémente IBindingList; une telle structure est BindingList<T>.


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

Blé Mitch
la source
... ce qui peut sembler évident mais tout est évident avec le recul :)
demoncodemonkey
12
Pouvez-vous expliquer ou ajouter bindingSource1la déclaration?
beppe9000
1
System.Windows.Forms.BindingSource bindingSource1;
2.718
Est-ce comboBox1.DataSource = bindingSource1.DataSource;correct? ou ça devrait être comboBox1.DataSource = bindingSource1;?
Masoud
27

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 en tant qu'élément sélectionné. Pour l'utiliser, vous devez remplacer la ToString de Country.

2) Utilisez DataBinding, définissez DataSource sur 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 SelectionChanged,

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

}
Henk Holterman
la source
2
merci mais un peu de problème ici les noms ne sont pas visibles dans la liste déroulante lors de l'exécution de l'application
Mobin
23
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.

Robert Tonnessen
la source
1
Cela fonctionne sauf que l'événement SelectionChanged ne semble pas être sur le contrôle dans .NET 4.0. J'ai remplacé cela par SelectionChangeCommitted et tout va bien.
Wade Hatler
0

Essayez quelque chose comme ceci:

yourControl.DataSource = countryInstance.Cities;

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

yourControl.DataBind();
Andrew Hare
la source
1
ainsi que comboBox1.DataBind (); fonction je ne le vois pas dans les solutions que j'utilise winforms
Mobin
0
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 actuellement.

Mobin
la source
1
Quelques notes: Une bindingSource est une sorte de source de liaison, vous ne l'utilisez pas vraiment maintenant, probablement OK. Mais si vous voulez l'utiliser pour relier d'autres choses, utilisez member_cbx = bindingSource1;
Henk Holterman
-1

Si vous utilisez un ToolStripComboBox, aucun DataSource n'est exposé (.NET 4.0):

List<string> someList = new List<string>();
someList.Add("value");
someList.Add("value");
someList.Add("value");

toolStripComboBox1.Items.AddRange(someList.ToArray());
John M
la source
3
Dans ce cas, vous devez utiliser ToolstripComboBox.ComboBox.DataSource. Cela ressemble à ToolstripComboBoxun emballage pour un normal ComboBox.
yu_ominae