2011-03-29 3 views
5


I plusieurs objets de la classe:DataBinding ComboBox provoque 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; 
    } 
} 

et une classe qui a une propriété de type Person:

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

Et je veux lier Cl.Person à combobox. Lorsque je tente de le faire comme ceci:

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

je reçois un ArgumentException. Comment dois-je modifier ma liaison pour obtenir le bon comportement du programme?
Merci d'avance!

Répondre

7

Bind à « 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

Essayez

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

au lieu

Vous devez dire la combobox qui propriété sur elle, vous voulez lier à laquelle la propriété sur votre objet (sa propriété de texte, dans mon exemple qui affiche le nom propriété de la personne sélectionnée).

* EDIT: * ferraille En fait, je commençais à me confondre. Vous avez presque eu, ne combobox doesn; t ont une propriété appelée élément, vous voulez SelectedItem à la place, comme ceci:

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

Je veux que combobox contienne des personnes au lieu de simplement leurs noms. – StuffHappens

+0

@StuffHappens: Oui, ils vont l'ignorer et voir ma mise à jour – w69rdy

3

Pour databinding simple, cela fonctionnera

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

Mais je ne pense que c'est ce que tu veux. Je pense que vous voulez lier à une liste d'éléments, puis sélectionnez-en un.Pour se lier à une liste d'articles et de montrer la propriété Name, essayez ceci:

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

condition que votre classe Person remplace equals() de telle sorte que, par exemple, une personne est égale à une autre si elles ont le même nom, la liaison à la propriété SelectedItem fonctionnera comme si:

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

Si vous ne pouvez pas remplacer equals(), alors il vous suffit de vous assurer que vous faites référence à une instance personne dans la liste DataSource, de sorte que le code ci-dessous Travaille pour votre code spécifique:

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

si vous utilisez énumérations peut être u ont une classe de énumérations vous pouvez une zone de liste déroulante comme celui-ci

  1. Spécifiez la zone de liste déroulante datasourse par exemple

    comboBoxname.DataSource = Enum.GetValues(typeof(your enum)); 
    
  2. permet maintenant lier la boîte de combox puisque nous avons la source de données

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