Bir Liste bir ComboBox'a nasıl bağlanır?


107

BindingSourceBir sınıf nesneleri listesine ve ardından bir ComboBox öğesine nesneler değeri bağlamak istiyorum .
Biri nasıl yapılacağını önerebilir mi?

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

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

benim sınıfım ve namealanını daha sonra bir ComboBox ile ilişkilendirilebilecek bir BindingSource'a bağlamak istiyorum


Winforms istediğim şey, ülke nesnesi
rest'in

Yanıtlar:


160

Bir birleşik giriş kutusuna atıfta bulunduğunuz için, 2 yönlü veri bağlama kullanmak istemediğinizi varsayıyorum (öyleyse, a kullanmaya bakın 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";

Ciltli combobox'unda seçilen ülkeyi bulmak için, böyle bir şey yapsın: Country country = (Country)comboBox1.SelectedItem;.

ComboBox'ın dinamik olarak güncellenmesini istiyorsanız, DataSourceuygulama olarak ayarladığınız veri yapısının olduğundan emin olmanız gerekir IBindingList; böyle bir yapı BindingList<T>.


İpucu: DisplayMemberalanını herkese açık bir alana değil, sınıftaki bir Mülke bağladığınızdan emin olun . Sınıf kullanırsanız public string Name { get; set; }, işe yarayacaktır, ancak kullanırsa public string Name;değere erişemeyecek ve bunun yerine, açılan kutudaki her satır için nesne türünü görüntüleyecektir.


... bu apaçık görünebilir ama sonra her şey sonradan anlaşılır :)
demoncodemonkey

12
bindingSource1Beyannameyi açıklayabilir veya ekleyebilir misiniz ?
beppe9000

1
System.Windows.Forms.BindingSource bindingSource1;
2.718

comboBox1.DataSource = bindingSource1.DataSource;doğru? yoksa olmalı comboBox1.DataSource = bindingSource1;?
Masoud

27

Arka planlayıcı için, ComboBox / ListBox kullanmanın 2 yolu vardır.

1) Öğeler özelliğine Ülke Nesneleri ekleyin ve Seçili öğe olarak bir Ülkeyi alın. Bunu kullanmak için Ülke Hedef Dizisini geçersiz kılmalısınız.

2) DataBinding'i kullanın, DataSource'u bir IList'e ayarlayın (List <>) ve DisplayMember, ValueMember ve SelectedValue kullanın

2 için) önce bir ülke listesine ihtiyacınız olacak

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

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

Ve sonra SelectionChanged'da,

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

}

2
teşekkürler, ancak burada biraz sorun var, uygulamayı çalıştırırken
birleşik giriş

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.


1
Bu, SelectionChanged olayının .NET 4.0'daki denetimde görünmemesi dışında çalışır. Bunu SelectionChangeCommission ile değiştirdim ve her şey yolunda.
Wade Hatler

0

Bunun gibi bir şey dene:

yourControl.DataSource = countryInstance.Cities;

WebForms kullanıyorsanız, şu satırı eklemeniz gerekir:

yourControl.DataBind();

1
yanı sıra comboBox1.DataBind (); işlevini çözümlerde göremiyorum
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";

Şu anda kullandığım kod bu.


1
Birkaç Not: Bir bağlama kaynağı, bir tür bağlantı kaynağıdır, şimdi gerçekten kullanmıyorsunuz, muhtemelen Tamam. Ancak, başka şeyler arasında bağlantı kurmak için kullanmak istiyorsanız, member_cbx = bindingSource1;
Henk Holterman

-1

Bir ToolStripComboBox kullanıyorsanız, açığa çıkan DataSource yoktur (.NET 4.0):

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

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

3
Bu durumda kullanmanız gerekir ToolstripComboBox.ComboBox.DataSource. ToolstripComboBoxNormal bir paket gibi görünüyor ComboBox.
yu_ominae
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.