119 Stimmen

Wie bindet man eine Liste an eine ComboBox?

Ich möchte eine Verbindung BindingSource zu einer Liste von Klassenobjekten und dann Objekte Wert zu einer ComboBox.
Kann jemand einen Vorschlag machen, wie man das macht?

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

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

ist meine Klasse und ich möchte ihre name Feld zu einer BindingSource, die dann mit einer ComboBox verbunden werden kann

177voto

Mitch Wheat Punkte 287474

Da Sie sich auf eine Combobox beziehen, nehme ich an, dass Sie keine 2-Wege-Datenbindung verwenden möchten (wenn ja, schauen Sie sich die Verwendung einer 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";

Um das Land zu finden, das in der gebundenen Combobox ausgewählt wurde, würden Sie etwa so vorgehen: Country country = (Country)comboBox1.SelectedItem; .

Wenn Sie möchten, dass die ComboBox dynamisch aktualisiert wird, müssen Sie sicherstellen, dass die Datenstruktur, die Sie als DataSource implementiert IBindingList Eine solche Struktur ist BindingList<T> .


Tipp: Stellen Sie sicher, dass Sie die DisplayMember auf eine Eigenschaft der Klasse und nicht auf ein öffentliches Feld. Wenn Ihre Klasse public string Name { get; set; } wird es funktionieren, aber wenn es mit public string Name; kann es nicht auf den Wert zugreifen und zeigt stattdessen den Objekttyp für jede Zeile im Kombinationsfeld an.

28voto

Henk Holterman Punkte 249753

Für ein Hintergrundprogramm gibt es 2 Möglichkeiten, eine ComboBox/ListBox zu verwenden

1) Fügen Sie Länderobjekte zur Eigenschaft Items hinzu und rufen Sie ein Land als Selecteditem ab. Um dies zu verwenden, sollten Sie die Eigenschaft ToString von Country überschreiben.

2) Verwenden Sie DataBinding, setzen Sie die DataSource auf eine IList (List<>) und verwenden Sie DisplayMember, ValueMember und SelectedValue

Für 2) benötigen Sie zunächst eine Liste der Länder

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

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

Und dann in der SelectionChanged,

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

}

24voto

Robert Tonnessen Punkte 239
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");
}

Aufschwung.

0voto

Andrew Hare Punkte 332190

Versuchen Sie so etwas:

yourControl.DataSource = countryInstance.Cities;

Und wenn Sie WebForms verwenden, müssen Sie diese Zeile hinzufügen:

yourControl.DataBind();

0voto

Mobin Punkte 4780
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_CountryComboBox.ValueMember = "Name";

Dies ist der Code, den ich jetzt verwende.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X