Bagaimana cara mengikat Daftar ke Kotak Kombo?

107

Saya ingin menghubungkan BindingSourceke daftar objek kelas dan kemudian nilai objek ke ComboBox.
Adakah yang bisa menyarankan bagaimana melakukannya?

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

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

adalah kelas saya dan saya ingin mengikat namebidangnya ke BindingSource yang kemudian dapat dikaitkan dengan ComboBox

Mobin
sumber
Winforms apa yang saya inginkan adalah membantu saya menghubungkan nilai data di bidang nama objek negara sisanya saya akan mengetahuinya
Mobin

Jawaban:

160

Karena Anda mengacu pada kotak kombo, saya berasumsi Anda tidak ingin menggunakan penyatuan data 2 arah (jika demikian, lihat menggunakan 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";

Untuk menemukan negara yang dipilih di combobox terikat, Anda akan melakukan sesuatu seperti: Country country = (Country)comboBox1.SelectedItem;.

Jika Anda ingin ComboBox diperbarui secara dinamis, Anda harus memastikan bahwa struktur data yang telah Anda tetapkan sebagai DataSourceimplement IBindingList; salah satu struktur seperti itu BindingList<T>.


Tip: pastikan Anda mengikat DisplayMemberke Properti di kelas dan bukan ke bidang publik. Jika Anda menggunakan kelas public string Name { get; set; }itu akan berhasil tetapi jika menggunakannya public string Name;tidak akan dapat mengakses nilai dan sebaliknya akan menampilkan tipe objek untuk setiap baris di kotak kombo.

Mitch Wheat
sumber
... yang mungkin tampak jelas tetapi kemudian semuanya terlihat jelas di belakang :)
demoncodemonkey
12
Bisakah Anda menjelaskan atau menambahkan bindingSource1deklarasi?
beppe9000
1
System.Windows.Forms.BindingSource bindingSource1;
2.718
Apakah comboBox1.DataSource = bindingSource1.DataSource;benar? atau seharusnya comboBox1.DataSource = bindingSource1;?
Masoud
27

Untuk backgrounder, ada 2 cara menggunakan ComboBox / ListBox

1) Tambahkan Objek Negara ke properti Item dan ambil Negara sebagai Item yang Dipilih. Untuk menggunakan ini, Anda harus mengganti ToString Negara.

2) Gunakan DataBinding, atur DataSource ke IList (List <>) dan gunakan DisplayMember, ValueMember dan SelectedValue

Untuk 2) Anda memerlukan daftar negara terlebih dahulu

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

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

Dan kemudian di SelectionChanged,

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

}
Henk Holterman
sumber
2
terima kasih tapi sedikit masalah di sini Nama tidak terlihat di kotak kombo saat menjalankan aplikasi
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");
}

ledakan.

Robert Tonnessen
sumber
1
Ini bekerja kecuali acara SelectionChanged tampaknya tidak berada di kontrol di .NET 4.0. Saya menggantinya dengan SelectionChangeCommitted dan semuanya baik-baik saja.
Wade Hatler
0

Coba sesuatu seperti ini:

yourControl.DataSource = countryInstance.Cities;

Dan jika Anda menggunakan WebForms, Anda perlu menambahkan baris ini:

yourControl.DataBind();
Andrew Hare
sumber
1
serta comboBox1.DataBind (); fungsi saya tidak melihatnya dalam solusi Saya menggunakan 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";

Ini adalah kode yang saya gunakan sekarang.

Mobin
sumber
1
Beberapa Catatan: BindingSource adalah sejenis sumber tautan, Anda tidak benar-benar menggunakannya sekarang, mungkin Oke. Tetapi jika Anda ingin menggunakannya untuk menghubungkan hal-hal lain, gunakan member_cbx = bindingSource1;
Henk Holterman
-1

Jika Anda menggunakan ToolStripComboBox, tidak ada DataSource yang terpapar (.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
sumber
3
Dalam hal ini Anda perlu menggunakan ToolstripComboBox.ComboBox.DataSource. Sepertinya ToolstripComboBoxini adalah pembungkus untuk yang normal ComboBox.
yu_ominae