Як прив’язати список до ComboBox?


107

Я хочу підключити a BindingSourceдо списку об’єктів класу, а потім значення об'єктів до ComboBox.
Хтось може підказати, як це зробити?

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

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

- це мій клас, і я хочу прив’язати його nameполе до BindingSource, який потім може бути пов'язаний з ComboBox


Winforms, що я хочу, це допоможе мені з'єднати значення даних у полі імен решти країни об'єкта, я
розберу

Відповіді:


160

Оскільки ви посилаєтесь на комбінований ящик, я припускаю, що ви не хочете використовувати двостороння прив'язка даних (якщо так, подивіться на використання 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";

Для того, щоб знайти країну , обрану в пов'язаному полі зі списком, ви могли б зробити що - щось на кшталт: Country country = (Country)comboBox1.SelectedItem;.

Якщо ви хочете , щоб ComboBox динамічно оновлювати вам необхідно переконатися , що структури даних , які ви встановили в якості DataSourceзнаряддя IBindingList; одна така структура BindingList<T>.


Порада: переконайтеся, що ви прив'язуєте DisplayMemberдо властивості класу, а не до публічного поля. Якщо ви користуєтесь класом, public string Name { get; set; }він буде працювати, але якщо він використовує, public string Name;він не зможе отримати доступ до значення, а натомість відобразить тип об'єкта для кожного рядка у поле комбо.


... що може здатися очевидним, але тоді все очевидно заднім
поглядом

12
Чи можете ви пояснити або додати bindingSource1декларацію?
beppe9000

1
System.Windows.Forms.BindingSourceindingSource1;
2.718,

Є чи comboBox1.DataSource = bindingSource1.DataSource;правильно? чи так має бути comboBox1.DataSource = bindingSource1;?
Масуд

27

Для backgrounder є два способи використання ComboBox / ListBox

1) Додайте об'єкти країни до властивості елементів та отримайте країну як вибрану. Щоб скористатись цим, вам слід перекрити ToString Country.

2) Використовуйте прив'язку даних, встановіть джерело даних у IList (список <>) та використовуйте DisplayMember, ValueMember та SelectedValue

Для 2) спочатку вам знадобиться список країн

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

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

А потім у SelectionChanged,

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

}

2
спасибі, але трохи проблеми тут Імена не видно у комбобоксі під час запуску програми
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");
}

бум.


1
Це працює, за винятком того, що подія SelectionChanged не є в керуванні в .NET 4.0. Я замінив це SelectionChangeCommitted і все добре.
Уейд Хатлер

0

Спробуйте щось подібне:

yourControl.DataSource = countryInstance.Cities;

І якщо ви використовуєте WebForms, вам потрібно буде додати цей рядок:

yourControl.DataBind();

1
а також comboBox1.DataBind (); Функція я не бачу його у рішеннях, я використовую
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";

Це код, яким я зараз користуюся.


1
Кілька приміток: зв'язуючий джерело - це своєрідне джерело посилання, ви зараз не використовуєте його, ймовірно, добре. Але якщо ви хочете використовувати його для з'єднання інших речей, використовуйте member_cbx =indingSource1;
Хенк Холтерман

-1

Якщо ви використовуєте ToolStripComboBox, джерела даних не буде відкрито (.NET 4.0):

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

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

3
У такому випадку вам потрібно скористатися ToolstripComboBox.ComboBox.DataSource. Схоже, ToolstripComboBoxце звичайна обгортка ComboBox.
yu_ominae
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.