Làm thế nào để liên kết một Danh sách với một ComboBox?


107

Tôi muốn kết nối a BindingSourcevới danh sách các đối tượng lớp và sau đó các đối tượng có giá trị với ComboBox.
Bất cứ ai có thể đề nghị làm thế nào để làm điều đó?

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

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

là lớp của tôi và tôi muốn liên kết nametrường của nó với một BindingSource mà sau đó có thể được liên kết với một ComboBox


Winforms những gì tôi muốn là giúp tôi kết nối các giá trị dữ liệu trong lĩnh vực tên của đối tượng nước nghỉ ngơi tôi sẽ tìm nó ra
mobin

Câu trả lời:


160

Khi bạn đang đề cập đến hộp kết hợp, tôi cho rằng bạn không muốn sử dụng kết hợp dữ liệu 2 chiều (nếu vậy, hãy xem cách sử dụng 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";

Để tìm quốc gia được chọn trong combobox ràng buộc, bạn sẽ làm điều gì đó như: Country country = (Country)comboBox1.SelectedItem;.

Nếu bạn muốn ComboBox tự động cập nhật, bạn sẽ cần đảm bảo rằng cấu trúc dữ liệu mà bạn đã đặt làm phần DataSourcetriển khai IBindingList; một cấu trúc như vậy là BindingList<T>.


Mẹo: hãy đảm bảo rằng bạn đang ràng buộc DisplayMemberThuộc tính trên lớp chứ không phải trường công khai. Nếu lớp của bạn sử dụng public string Name { get; set; }nó sẽ hoạt động nhưng nếu nó sử dụng public string Name;nó sẽ không thể truy cập giá trị và thay vào đó sẽ hiển thị kiểu đối tượng cho mỗi dòng trong hộp tổ hợp.


... mà có vẻ hiển nhiên, nhưng sau đó mọi thứ đều rõ ràng trong nhận thức muộn màng :)
demoncodemonkey

12
Bạn có thể giải thích hoặc bổ sung bindingSource1khai báo của?
beppe9000

1
System.Windows.Forms.BindingSource bindingSource1;
2,718

comboBox1.DataSource = bindingSource1.DataSource;đúng không? hoặc nó phải được comboBox1.DataSource = bindingSource1;?
Masoud

27

Đối với nền tảng, có 2 cách để sử dụng ComboBox / ListBox

1) Thêm Đối tượng Quốc gia vào thuộc tính Mục và truy xuất Quốc gia dưới dạng Selecteditem. Để sử dụng điều này, bạn nên ghi đè Chuỗi quốc gia.

2) Sử dụng DataBinding, đặt DataSource thành IList (Danh sách <>) và sử dụng DisplayMember, ValueMember và SelectedValue

Đối với 2) trước tiên bạn sẽ cần một danh sách các quốc gia

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

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

Và sau đó trong SelectionChanged,

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

}

2
cảm ơn, nhưng một chút của một vấn đề ở đây là tên không hiển thị trong combobox khi chạy ứng dụng
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");
}

bùng nổ.


1
Điều này hoạt động ngoại trừ sự kiện SelectionChanged dường như không nằm trong điều khiển trong .NET 4.0. Tôi đã thay thế điều đó bằng SelectionChangeComiled và tất cả đều ổn.
Wade Hatler

0

Hãy thử một cái gì đó như sau:

yourControl.DataSource = countryInstance.Cities;

Và nếu bạn đang sử dụng WebForms, bạn sẽ cần thêm dòng này:

yourControl.DataBind();

1
cũng như comboBox1.DataBind (); chức năng Tôi không nhìn thấy nó trong các giải pháp Tôi đang sử dụng 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";

Đây là mã tôi đang sử dụng bây giờ.


1
Một vài lưu ý: bindingSource là một loại nguồn liên kết thông qua, bạn không thực sự sử dụng nó bây giờ, có thể là Ok. Nhưng nếu bạn muốn sử dụng nó để liên kết những thứ khác, hãy sử dụng member_cbx = bindSource1;
Henk Holterman

-1

Nếu bạn đang sử dụng ToolStripComboBox thì không có DataSource nào được hiển thị (.NET 4.0):

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

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

3
Trong trường hợp đó bạn cần sử dụng ToolstripComboBox.ComboBox.DataSource. Nó trông giống như ToolstripComboBoxmột trình bao bọc cho một bình thường ComboBox.
yu_ominae
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.