2009-03-01 10 views
85

Chcę połączyć wiążącego źródła do listy obiektów klasy i następnie obiekty wartości do pola kombi może ktoś sugerują, jak to zrobićjak powiązać listę z comboboxem? (WinForm)

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

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

jest moja klasa i chcę związać swoją nazwę pole do źródła wiązania, które mogą być następnie związany z combobox

+0

WinForm co chcę mi pomóc połączyć wartości danych w polu nazwy obiektu kraj reszty i będzie zrozumieć to – Mobin

Odpowiedz

129

Jak odnosimy się do combobox, jestem przy założeniu, że nie chcesz używać 2-drożny wiązania z danymi (jeśli tak, spójrz na użyciu 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") }; 

bindingSource1.DataSource = countries; 

comboBox1.DataSource = bindingSource1.DataSource; 

comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "Name"; 
+3

dziękuję, ale trochę problem tutaj Nazwy nie są widoczne w combobox podczas uruchamiania aplikacji – Mobin

+1

Właśnie stworzyłem aplikację WinForm z dokładnie tym kodem i działa dobrze. –

+21

@Mobin Jeśli nazwy nie są widoczne, upewnij się, że wiążisz DisplayMember z właściwością w klasie, a nie z polem publicznym. Jeśli twoja klasa używa 'public string Name {get; zestaw; } 'będzie działać, ale jeśli używa' public string Name; 'nie będzie mógł uzyskać dostępu do wartości, a zamiast tego wyświetli typ obiektu dla każdej linii w polu kombi. –

0

spróbować czegoś takiego:

yourControl.DataSource = countryInstance.Cities; 

a jeśli używasz WebForms trzeba będzie dodać linię:

yourControl.DataBind(); 
+1

, który nie używa źródła powiązań ... –

+0

To o co prosiłem ??? – Mobin

+1

, a także comboBox1.DataBind(); funkcja nie widzę go w rozwiązaniach Używam WinForm – Mobin

20

Za dodatkową BACKGROUNDER istnieją 2 sposoby korzystania z combobox/ListBox

1) Dodać kraj oBJ ects do właściwości Items i pobiera kraj jako Selecteditem. Aby tego użyć, należy zastąpić ToString of Country.

2) Wykorzystanie DataBinding ustaw DataSource do IList (List <>) i użyj DisplayMember, ValueMember i SelectedValue

Dla 2) trzeba będzie wykaz państw pierwszych

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

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

I następnie w SelectionChanged,

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

} 
+2

dziękuję, ale trochę problem tutaj Nazwy nie są widoczne w combobox podczas uruchamiania aplikacji – 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_CountryComboBox.ValueMember = "Name"; 

to kod używam teraz

+1

Kilka uwag: A bindingSource jest rodzajem źródła link-through, nie używasz go teraz, prawdopodobnie OK. Ale jeśli chcesz użyć go do połączenia innych rzeczy, użyj member_cbx = bindingSource1; –

16
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"); 
} 

bum.

+0

Działa to z tym, że zdarzenie SelectionChanged nie znajduje się w formancie w .NET 4.0. Zamieniłem to na SelectionChangeCommitted i wszystko jest w porządku. –

+0

Dla mnie jest to doskonałe ... :-) –

-2

Jeśli używasz ToolStripComboBox nie jest narażony DataSource (.NET 4.0):

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

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

W takim przypadku musisz użyć 'ToolstripComboBox.ComboBox.DataSource'. Wygląda na to, że 'ToolstripComboBox' jest opakowaniem dla zwykłego' ComboBox'. –

Powiązane problemy