Search code examples
c#winformsdata-bindingcombobox

How to bind a List to a ComboBox?


I want to connect a BindingSource to a list of class objects and then objects value to a ComboBox.
Can anyone suggest how to do it?

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

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

is my class and I want to bind its name field to a BindingSource which could be then associated with a ComboBox


Solution

  • As you are referring to a combobox, I'm assuming you don't want to use 2-way databinding (if so, look at using 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";
    

    To find the country selected in the bound combobox, you would do something like: Country country = (Country)comboBox1.SelectedItem;.

    If you want the ComboBox to dynamically update you'll need to make sure that the data structure that you have set as the DataSource implements IBindingList; one such structure is BindingList<T>.


    Tip: make sure that you are binding the DisplayMember to a Property on the class and not a public field. If you class uses public string Name { get; set; } it will work but if it uses public string Name; it will not be able to access the value and instead will display the object type for each line in the combo box.