2009-03-01 11 views
85

Quiero conectar una fuente de unión a una lista de objetos de la clase y luego los objetos de valor a un cuadro combinado puede alguien sugerir cómo hacerlocómo enlazar una lista a un combobox? (Windows Forms)

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

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

es mi clase y quiero unir su nombre campo a un origen de enlace que podría ser entonces asociada a un cuadro combinado

+0

Winforms Lo que quiero es ayudar a conectar los valores de los datos en el campo de nombres de descanso objeto país voy a averiguarlo – Mobin

Respuesta

129

Como se está refiriendo a un cuadro combinado, estoy asumiendo que no desea utilizar de 2 vías de enlace de datos (si es así, buscar en el uso de 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

gracias pero un pequeño problema aquí los nombres no son visibles en el cuadro combinado al ejecutar la aplicación – Mobin

+1

Acabo de crear una aplicación de winforms con exactamente ese código y funciona bien. –

+21

@Mobin Si los nombres no están visibles, asegúrese de estar vinculando el DisplayMember a una propiedad en la clase y no a un campo público. Si su clase usa 'public string Name {get; conjunto; } 'funcionará, pero si utiliza' public string Name; 'no podrá acceder al valor y en su lugar mostrará el tipo de objeto para cada línea en el cuadro combinado. –

0

intentar algo como esto:

yourControl.DataSource = countryInstance.Cities; 

Y si utiliza formularios Web tendrá que añadir esta línea:

yourControl.DataBind(); 
+1

que no usa un bindingsource ... –

+0

¿Eso es lo que estaba pidiendo? – Mobin

+1

así como también comboBox1.DataBind(); función no lo veo en soluciones Estoy usando winforms – Mobin

20

para una información general, hay 2 maneras de utilizar un ComboBox/ListBox

1) Añadir País Obj afecta a la propiedad Elementos y recupera un País como Elemento seleccionado. Para usar esto, debe anular el ToString del país.

2) Uso DataBinding, establezca el origen de datos a un IList (Lista <>) y el uso DisplayMember, ValueMember y SelectedValue

Para 2) se necesita una lista de los países del primer

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

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

Y a continuación, en el SelectionChanged,

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

} 
+2

gracias pero un pequeño problema aquí Los nombres no están visibles en el cuadro combinado al ejecutar la aplicación – 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"; 

Este es el código que estoy usando ahora

+1

Algunas notas: Un bindingSource es una especie de fuente de enlace, realmente no la está usando ahora, probablemente está bien. Pero si desea usarlo para vincular otras cosas, use 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

Esto funciona, excepto que el evento SelectionChanged no parece estar en el control en .NET 4.0. Reemplacé eso con SelectionChangeCommitted y todo está bien. –

+0

Para mí, es excelente yaar ... :-) –

-2

Si está utilizando un ToolStripComboBox no hay ninguna fuente de datos expuesta (.NET 4.0):

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

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

En ese caso, necesitas usar 'ToolstripComboBox.ComboBox.DataSource'. Parece que 'ToolstripComboBox' es un contenedor para un' ComboBox' normal. –

Cuestiones relacionadas