ComboBox数据绑定引发ArgumentException异常

5
我有几个类的对象:


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;
    }
}

以及一个具有类型为Person的属性的类:

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

我希望将Cl.Person绑定到下拉列表框中。当我尝试这样做时:

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

我遇到了一个 ArgumentException。我应该如何修改绑定以获得正确的程序行为?
提前感谢!

4个回答

7

绑定到“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");

3

对于简单的数据绑定,这将起作用

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

但我认为那不是你想要的。我想你想要将其绑定到一个项目列表,然后选择其中一个。要绑定到项目列表并显示名称属性,请尝试以下内容:

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

假设您的Person类重写了Equals()方法,使得两个Person对象只有在具有相同的Name属性时才被视为相等,则绑定到SelectedItem属性将按以下方式工作:

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

如果你无法重写Equals()方法,那么你只需要确保你从DataSource列表中引用了一个Person实例,这样下面的代码就可以针对你的特定代码工作:

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

1

尝试

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

而不是

您需要告诉组合框要将其绑定到对象的哪个属性(在我的示例中,它是Text属性,它将显示所选人员的Name属性)。

*编辑:* 实际上忘掉那个,我有点混淆了。你几乎做到了,只是组合框没有一个叫做item的属性,你应该使用SelectedItem,像这样:

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

我想让组合框包含人员而不仅仅是他们的姓名。 - StuffHappens
@StuffHappens:是的,他们会,但无论如何请忽略那个并查看我的更新。 - Iain Ward

0
如果您正在使用枚举,可能会有一个枚举类,您可以像这样使用组合框。
  1. 指定组合框数据源,例如:

    comboBoxname.DataSource = Enum.GetValues(typeof(your enum));
    
  2. 现在我们可以绑定组合框了,因为我们有了数据源

    comboBoxname.DataBindings.Add("SelectedItem",
                                  object,
                                  "对象中枚举类型的字段");
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接