.NET WinForms - вопрос о связывании со списком источников - PullRequest
1 голос
/ 01 августа 2011

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

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. Создан новый источник данных из моего класса 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. Кто-нибудь может дать мне представление об этом? Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Вы можете сделать так, как предлагает Том, но есть по крайней мере один простой способ сделать это, не заменяя 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.

1 голос
/ 01 августа 2011

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

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

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

...