Wie binde ich eine Liste an eine ComboBox?

107

Ich möchte eine Verbindung BindingSourcezu einer Liste von Klassenobjekten herstellen und dann einen Objektwert zu einer ComboBox.
Kann jemand vorschlagen, wie es geht?

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 ihr nameFeld an eine BindingSource binden , die dann einer ComboBox zugeordnet werden kann

Mobin
quelle
Winforms, was ich will, ist mir zu helfen, die Datenwerte im Namensfeld des Landes Objekt Rest zu verbinden Ich werde es herausfinden
Mobin

Antworten:

160

Da Sie sich auf eine Combobox beziehen, gehe ich davon aus, dass Sie keine bidirektionale Datenbindung verwenden möchten (wenn ja, schauen Sie sich die Verwendung von a an 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 in der gebundenen Combobox ausgewählte Land zu finden, gehen Sie wie folgt vor : 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 DataSourceImplementierung festgelegt haben IBindingList, vorhanden ist. Eine solche Struktur ist BindingList<T>.


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

Mitch Wheat
quelle
... was offensichtlich erscheinen mag, aber im Nachhinein ist alles offensichtlich :)
Demoncodemonkey
12
Können Sie die Erklärung erklären oder hinzufügen bindingSource1?
beppe9000
1
System.Windows.Forms.BindingSource bindingSource1;
2.718
Ist comboBox1.DataSource = bindingSource1.DataSource;richtig? oder sollte es sein comboBox1.DataSource = bindingSource1;?
Masoud
27

Für einen Hintergrund gibt es zwei Möglichkeiten, eine ComboBox / ListBox zu verwenden

1) Fügen Sie der Items-Eigenschaft Länderobjekte hinzu und rufen Sie ein Land als ausgewähltes Element ab. Um dies zu verwenden, sollten Sie den ToString of Country überschreiben.

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

Für 2) benötigen Sie zuerst 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;

}
Henk Holterman
quelle
2
danke, aber ein kleines Problem hier sind die Namen in der Combobox nicht sichtbar, wenn die Anwendung ausgeführt wird
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
quelle
1
Dies funktioniert, außer dass das SelectionChanged-Ereignis in .NET 4.0 nicht auf dem Steuerelement zu sein scheint. Ich habe das durch SelectionChangeCommitted ersetzt und alles ist gut.
Wade Hatler
0

Versuchen Sie so etwas:

yourControl.DataSource = countryInstance.Cities;

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

yourControl.DataBind();
Andrew Hare
quelle
1
sowie comboBox1.DataBind (); Funktion Ich sehe es nicht in Lösungen Ich verwende 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";

Dies ist der Code, den ich jetzt verwende.

Mobin
quelle
1
Ein paar Anmerkungen: Eine BindingSource ist eine Art Link-Through-Quelle. Sie verwenden sie derzeit nicht wirklich, wahrscheinlich in Ordnung. Wenn Sie es jedoch verwenden möchten, um andere Inhalte zu verknüpfen, verwenden Sie member_cbx = bindingSource1.
Henk Holterman
-1

Wenn Sie eine ToolStripComboBox verwenden, ist keine DataSource verfügbar (.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.
quelle
3
In diesem Fall müssen Sie verwenden ToolstripComboBox.ComboBox.DataSource. Es sieht aus wie ToolstripComboBoxein Wrapper für einen normalen ComboBox.
Yu_ominae