Привязка данных ComboBox вызывает ArgumentException - PullRequest
5 голосов
/ 29 марта 2011


Я несколько объектов класса:

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 голосов
/ 29 марта 2011

Привязка к «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 голосов
/ 29 марта 2011

Для простого связывания данных это будет работать

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

Но я не думаю, что вы этого хотите.Я думаю, что вы хотите привязать к списку элементов, а затем выберите один.Чтобы связать со списком элементов и показать свойство Name, попробуйте следующее:

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

При условии, что ваш класс Person переопределяет Equals (), так что, скажем, Person равен другому, если у них одинаковое имятогда привязка к свойству SelectedItem будет работать следующим образом:

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

Если вы не можете переопределить Equals (), вам просто нужно убедиться, что вы ссылаетесь на экземпляр Person из списка DataSource,поэтому приведенный ниже код работает для вашего конкретного кода:

Cl cl = new Cl();
cl.Person = ((List<Person>)comboBox1.DataSource)[1];
comboBox.DataBindings.Add("SelectedItem", cl, "Person");
1 голос
/ 29 марта 2011

Попробуйте

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");
0 голосов
/ 26 сентября 2012

если вы используете Enums, может быть, у вас есть класс enums, вы можете использовать поле со списком, подобное этому

  1. Укажите источник данных поля со списком, например

    comboBoxname.DataSource = Enum.GetValues(typeof(your enum));
    
  2. Теперь давайте свяжем поле со списком, так как у нас есть источник данных

    comboBoxname.DataBindings.Add("SelectedItem",
                                  object,
                                  "field of type enum in the object");
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...