2011-03-29 16 views
5


I varios objetos de la clase:ComboBox DataBinding causa ArgumentException

class Person 
{ 
    public string Name { get; set; } 
    public string Sex { get; set; } 
    public int Age { get; set; } 

    public override string ToString() 
    { 
     return Name + "; " + Sex + "; " + Age; 
    } 
} 

y una clase que tiene una propiedad de tipo Person:

class Cl 
{ 
    public Person Person { get; set; } 
} 

Y quiero obligar a Cl.Person cuadro combinado. Cuando trato de hacerlo de esta manera:

Cl cl = new cl(); 
comboBox.DataSource = new List<Person> {new Person{Name = "1"}, new Person{Name = "2"}}; 
comboBox.DataBindings.Add("Item", cl, "Person"); 

consigo un ArgumentException. ¿Cómo debo modificar mi enlace para obtener el comportamiento correcto del programa?
¡Gracias de antemano!

Respuesta

7

Enlazar a "SelectedItem":

 var persons = new List<Person> { new Person() { Name = "John Doe"}, new Person() { Name = "Scott Tiger" }}; 
     comboBox1.DisplayMember = "Name"; 
     comboBox1.DataSource = persons; 
     comboBox1.DataBindings.Add("SelectedItem", cl, "Person"); 
1

Trate

comboBox.DataBindings.Add("Text", cl, "Person.Name"); 

lugar

Usted necesita decir el cuadro combinado que la propiedad sobre ella desea enlazar a la cual la propiedad en el objeto (que es propiedad de texto, en mi ejemplo, que mostrará el nombre propiedad de la persona seleccionada).

* EDIT: * scrap hecho de que, me estaba confundido. Casi lo tenía, solamente cuadro combinado doesn; t tiene un elemento de propiedad llamada, desea SelectedItem lugar, como este:

Cl cl = new cl(); 
comboBox.DataSource = new List<Person> {new Person{Name = "1"}, new Person{Name = "2"}}; 
comboBox.DataBindings.Add("SelectedItem", cl, "Person"); 
+0

Quiero que el cuadro combinado contenga Personas en lugar de solo sus nombres. – StuffHappens

+0

@StuffHappens: Sí, lo ignorarán de todos modos y verán mi actualización – w69rdy

3

Para sencilla de enlace de datos, esto funcionará

cl.Person = new Person{ Name="Harold" }; 
comboBox.DataBindings.Add("Text",cl.Person, "Name"); 

pero no lo hago piensa que es lo que quieres Creo que desea enlazar a una lista de elementos, luego seleccione uno.Para unirse a una lista de elementos y mostrar la propiedad Name, intente esto:

comboBox.DataSource = new List<Person> {new Person{Name = "1"}, new Person{Name = "2"}}; 
comboBox.DisplayMember = "Name"; 

Siempre y cuando su clase Persona anula equals() de tal manera que, por ejemplo, una persona es igual a otra si tienen el mismo nombre, a continuación, unión a la propiedad SelectedItem funcionará así:

Cl cl = new Cl {Person = new Person {Name="2" }}; 
comboBox.DataBindings.Add("SelectedItem", cl, "Person"); 

Si no puede sobrescribir equals(), a continuación, sólo tiene que asegurarse de que está haciendo referencia una instancia de la persona de la lista de origen de datos, por lo que el código de abajo funciona para su código específico:

Cl cl = new Cl(); 
cl.Person = ((List<Person>)comboBox1.DataSource)[1]; 
comboBox.DataBindings.Add("SelectedItem", cl, "Person"); 
0

si está utilizando enumeraciones puede haber u tiene una clase de enumeraciones puede un cuadro combinado como éste

  1. Especificar el cuadro combinado datasourse por ejemplo

    comboBoxname.DataSource = Enum.GetValues(typeof(your enum)); 
    
  2. Ahora vamos a obligar a la caja de combox ya que tenemos la fuente de datos

    comboBoxname.DataBindings.Add("SelectedItem", 
               object, 
               "field of type enum in the object");