Pregunta ComboBox DataBinding causa ArgumentException



Tengo varios objetos de clase:

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 atar Cl.Person a la caja combinada. Cuando trato de hacerlo así:

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

Obtengo un ArgumentException. ¿Cómo debo modificar mi enlace para obtener el comportamiento correcto del programa?
¡Gracias por adelantado!


5
2018-03-29 11:49


origen


Respuestas:


Enlace 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");

7
2018-03-29 12:10



Para enlace de datos simple, esto funcionará

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

Pero no creo que eso es lo que quieres. Creo que desea enlazar a una lista de elementos, luego seleccione uno. Para enlazar a una lista de elementos y mostrar la propiedad Nombre, intente esto:

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

Siempre que su clase de Persona anule Equals () de tal manera que, por ejemplo, una Persona es igual a otra si tienen el mismo Nombre, entonces el enlace a la propiedad SelectedItem funcionará así:

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

Si no puede anular Equals (), entonces debe asegurarse de que está haciendo referencia a una instancia de Person de la lista de DataSource, de modo que el siguiente código funcione para su código específico:

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

3
2018-03-29 12:04



Tratar

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

en lugar

Debe indicar al cuadro de combinación qué propiedad de él desea vincular a qué propiedad de su objeto (es propiedad de Texto, en mi ejemplo, que mostrará la propiedad Nombre de la persona seleccionada).

*EDITAR:* En realidad desecho eso, me estaba confundiendo. Casi lo tienes, solo combobox no tiene una propiedad llamada item, en su lugar quieres SelectedItem, así:

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

1
2018-03-29 11:57



Si está utilizando Enums puede que tenga una clase de enumerados, puede usar un cuadro combinado como este

  1. Especifique el datasourse del cuadro combinado, por ejemplo

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

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

0
2017-09-26 10:09