.NET WinForms combobox bindingsource and databinding question

Я создал следующий класс для моделирования человека:

namespace DataBindingTest
{
    public enum colorEnum
    {
        Red,
        Green,
        Yellow,
        Blue,
    }

    class Person
    {
        private string _Name;
        private int _Age;
        private colorEnum _FavoriteColor;
        private bool _HasAllergies;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }

        public colorEnum FavoriteColor
        {
            get { return _FavoriteColor; }
            set { _FavoriteColor = value; }
        }

        public bool HasAllergies
        {
            get { return _HasAllergies; }
            set { _HasAllergies = value; }
        }

    }
}

В моей основной форме у меня есть поле со списком, которое будет привязано к массиву объектов Person. Когда я выбираю человека из этого поля со списком, я хочу отобразить его возраст (в элементе управления NumericUpDown), наличие у него аллергии (в виде флажка) и его любимый цвет (в другом поле со списком с DropDownStyle, установленным в DropDownList). Для этого у меня есть:

  1. В мою форму добавлен comboBox (comboBoxPeople), элемент управления NumericUpDown, checkBox и еще один comboBox (comboBoxFavoriteColor).
  2. Создал новый DataSource из моего класса Person, объявленного выше
  3. Добавлен BindingSource в мою форму
  4. Задайте для свойства DataSource BindingSource значение DataSource, определенное в # 2.
  5. Установите DataSource для comboBoxPeople на BindingSource и DisplayMember на свойство Name объекта BindingSource.
  6. Я привязал свойство Age объекта BindingSource к элементу управления NumericUpDown, а свойство HasAllergies элемента BindingSource - к элементу управления checkBox.
  7. В моем конструкторе я создал массив из 3 объектов Person, определил все их свойства, а затем установил свойство DataSource объекта BindingSource для этого массива.

Пока все работает как положено. Теперь я хотел бы отобразить любимый цвет человека (то есть свойство FavoriteColor объекта BindingSource) в comboBoxFavoriteColor. Я установил для DropDownStyle значение DropDownList, поскольку FavoriteColor - это перечисление. Однако мне неясно, как я должен привязать этот comboBox, чтобы он 1) содержал значения перечисления FavoriteColor и 2) имел соответствующий цвет, установленный в качестве SelectedItem, когда я выбираю человека из comboBoxPeople. Кто-нибудь может дать мне представление об этом? Большое спасибо!


person bmt22033    schedule 01.08.2011    source источник


Ответы (2)


Вы могли бы поступить так, как предлагает Том, но есть по крайней мере один простой способ сделать это, не заменяя Person.FavoriteColor строкой.

Добавьте свойство в Person с именем FavoriteColorString:

public class Person 
{
    [...]
    public colorEnum FavoriteColor { get; set; }
    public string FavoriteColorString
    {
        get { return FavoriteColor.ToString(); }
        set { FavoriteColor = (colorEnum)Enum.Parse(typeof(colorEnum), value);  }
    }
}

Перекомпилируйте, чтобы новое свойство отображалось в источнике привязки.

Теперь привяжите comboBoxFavoriteColor.SelectedItem к FavoriteColorString.

А во время выполнения сделайте, как сказал Том:

comboBoxFavoriteColor.DataSource = Enum.GetNames(typeof(colorEnum));

Вуаля! Теперь он должен работать так, как вы хотите.

Когда вы сохраняете объекты настроек, просто не сохраняйте свойство FavoriteColorString.

person Igby Largeman    schedule 01.08.2011
comment
Это работает именно так, как я хочу! :-) И это дважды за один и тот же уик-энд, когда вы дали мне идеальное объяснение того, что я пытался сделать. Мое вам искреннее спасибо! - person bmt22033; 01.08.2011
comment
Не за что. Спасибо за хорошо написанные вопросы! - person Igby Largeman; 01.08.2011
comment
Есть ли шанс, что вы знаете, как это сделать, когда перечисление содержит атрибуты DescriptionAttributes? Когда я это делаю, значение в установщике выглядит как комбинация фактического значения перечисления + атрибута DescriptionAttribute, что, кажется, приводит к исключению, поскольку это значение не может быть найдено в перечислении. - person bmt22033; 04.08.2011
comment
Я не могу понять, почему это могло произойти. Должно быть что-то, чего я не знаю о вашем коде. Вы можете показать мне объявление enum (или его часть)? Я попробовал, и атрибуты DescriptionAttributes для меня ничего не изменили. - person Igby Largeman; 04.08.2011
comment
В моем проекте что-то испортилось. Я заметил, что форма больше не отображается в дизайнере должным образом. Итак, я в основном заново создал свой проект, и теперь все работает правильно. Спасибо за ответ, и я ценю вашу помощь! - person bmt22033; 04.08.2011

Вам нужно сделать что-то в этом роде:

    string[] colors = Enum.GetNames(typeof(colorEnum));
    this.comboBox1.DataSource = colors;

..и, чтобы упростить задачу, просто сохраните любимый цвет как тип string, а не как colorEnum

person Tom Studee    schedule 01.08.2011
comment
Спасибо, теперь comboBoxFavoriteColor заполняется цветами из перечисления цветов. Но мне все еще нужно, чтобы выбранный цвет отображался в поле со списком, когда я выбираю человека в comboBoxPeople. Я сопоставил Age со своим элементом управления NumericUpDown, просто указав, что свойство Value элемента управления должно быть привязано к bindingSource1 - Age. Однако, похоже, это не работает для цветного комбинированного списка. Я могу выбрать человека 1 и установить его любимый цвет - красный. Но когда я перехожу на человека 2, поле со списком цветов по-прежнему остается красным. Я хочу, чтобы он обновился, чтобы отобразить цвет для этого человека. - person bmt22033; 01.08.2011