2009-03-01 18 views
85

voglio collegare una sorgente di legame a una lista di oggetti di classe e poi gli oggetti valore a una casella combinata qualcuno può suggerire come farlocome associare una lista a una casella combinata? (WinForms)

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

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

è la mia classe e voglio legare il suo nome campo per una fonte vincolante che potrebbe essere poi associato ad una casella combinata

+0

WinForms Quello che voglio è aiutami collegare i valori dei dati nei nomi campo oggetto Stato resto io capirlo – Mobin

risposta

129

Come si fa riferimento a una casella combinata, sto assumendo che non si desidera utilizzare 2 vie associazione dati (in caso affermativo, guardare con un 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

grazie ma un po 'di problema qui i nomi non sono visibili nella combobox quando si esegue l'applicazione – Mobin

+1

Ho appena creato un'app winforms con esattamente quel codice e funziona perfettamente. –

+21

@Mobin Se i nomi non sono visibili, assicurati di associare DisplayMember a una proprietà sulla classe e non a un campo pubblico. Se la tua classe usa 'public string Name {get; impostato; } 'funzionerà ma se usa' public string Name; 'non sarà in grado di accedere al valore e invece visualizzerà il tipo di oggetto per ogni riga nella casella combinata. –

0

provare qualcosa di simile:

yourControl.DataSource = countryInstance.Cities; 

E se si sta utilizzando WebForms è necessario aggiungere questa riga:

yourControl.DataBind(); 
+1

che non usa una fonte di associazione ... –

+0

Questo è quello che stavo chiedendo ??? – Mobin

+1

e comboBox1.DataBind(); funzione non la vedo nelle soluzioni Sto usando winforms – Mobin

20

per un Backgrounder, ci sono 2 modi per utilizzare un controllo ComboBox/ListBox

1) Aggiungere Paese Obj ects alla proprietà Items e recupera un Paese come Selecteditem. Per usare questo devi sovrascrivere ToString of Country.

2) Utilizzare DataBinding, impostare il DataSource a un IList (Lista <>) e utilizzare DisplayMember, ValueMember e SelectedValue

Per 2) avrete bisogno di un elenco di paesi primi

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

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

E poi nel SelectionChanged,

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

} 
+2

grazie ma un po 'di problema qui i nomi non sono visibili nella combobox quando si esegue l'applicazione – 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"; 

Questo è il codice che sto usando ora

+1

Alcune note: una fonte di binding è una sorta di sorgente link-through, in realtà non lo si sta usando, probabilmente Ok. Ma se vuoi usarlo per collegare altre cose, usa 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"); 
} 

boom.

+0

Funziona eccetto che l'evento SelectionChanged non sembra essere sul controllo in .NET 4.0. L'ho sostituito con SelectionChangeCommitted e tutto va bene. –

+0

Per me, è eccellente yaar ... :-) –

-2

Se si utilizza un ToolStripComboBox non c'è DataSource esposta (NET 4.0):

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

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

In questo caso è necessario utilizzare 'ToolstripComboBox.ComboBox.DataSource'. Sembra che 'ToolstripComboBox' sia un wrapper per un normale' ComboBox'. –

Problemi correlati