Come associare un elenco a un ComboBox?


107

Voglio collegare un BindingSourcea un elenco di oggetti di classe e quindi il valore degli oggetti a un ComboBox.
Qualcuno può suggerire come farlo?

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

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

è la mia classe e voglio associare il suo namecampo a un BindingSource che potrebbe essere quindi associato a un ComboBox


Winforms quello che voglio è aiutarmi a collegare i valori dei dati nel campo dei nomi del resto dell'oggetto paese lo
scoprirò

Risposte:


160

Dato che ti riferisci a una casella combinata, presumo che tu non voglia utilizzare l'associazione dati a 2 vie (se è così, guarda usando 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";

Per trovare il paese selezionato nel combobox rilegato, si potrebbe fare qualcosa di simile: Country country = (Country)comboBox1.SelectedItem;.

Se vuoi che il ComboBox si aggiorni dinamicamente dovrai assicurarti che la struttura dati che hai impostato come DataSourceimplementa IBindingList; una di queste strutture è BindingList<T>.


Suggerimento: assicurati di associare il DisplayMembera una proprietà sulla classe e non un campo pubblico. Se la tua classe lo usa public string Name { get; set; }funzionerà ma se lo usa public string Name;non sarà in grado di accedere al valore e invece mostrerà il tipo di oggetto per ogni riga nella casella combinata.


... che potrebbe sembrare ovvio ma poi tutto è ovvio col senno di poi :)
demoncodemonkey

12
Puoi spiegare o aggiungere bindingSource1la dichiarazione di?
beppe9000

1
System.Windows.Forms.BindingSource bindingSource1;
2.718

È comboBox1.DataSource = bindingSource1.DataSource;corretto? o dovrebbe essere comboBox1.DataSource = bindingSource1;?
Masoud

27

Per un backgrounder, ci sono 2 modi per usare un ComboBox / ListBox

1) Aggiungi oggetti Paese alla proprietà Articoli e recupera un Paese come Elemento selezionato. Per usarlo devi sovrascrivere la ToString di Country.

2) Usa DataBinding, imposta DataSource su IList (List <>) e usa DisplayMember, ValueMember e SelectedValue

Per 2) avrai prima bisogno di un elenco di paesi

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

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

E poi in SelectionChanged,

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

}

2
grazie ma un po 'di un problema qui i nomi non sono visibili nella casella combinata quando si esegue l'applicazione
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.


1
Funziona tranne che l'evento SelectionChanged non sembra essere sul controllo in .NET 4.0. L'ho sostituito con SelectionChangeCommitted e va tutto bene.
Wade Hatler

0

Prova qualcosa di simile:

yourControl.DataSource = countryInstance.Cities;

E se stai usando WebForms dovrai aggiungere questa riga:

yourControl.DataBind();

1
così come comboBox1.DataBind (); funzione non lo vedo nelle soluzioni Sto usando
winforms

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";

Questo è il codice che sto usando ora.


1
Alcune note: un bindingSource è una sorta di sorgente link-through, non lo stai davvero usando ora, probabilmente Ok. Ma se vuoi usarlo per collegare altre cose, usa member_cbx = bindingSource1;
Henk Holterman

-1

Se stai usando un ToolStripComboBox non c'è DataSource esposto (.NET 4.0):

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

toolStripComboBox1.Items.AddRange(someList.ToArray());

3
In tal caso è necessario utilizzare ToolstripComboBox.ComboBox.DataSource. Sembra che ToolstripComboBoxsia un involucro per un normale ComboBox.
yu_ominae
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.