.NET WinForms组合框绑定源和数据绑定问题

.NET WinForms组合框绑定源和数据绑定问题,.net,winforms,data-binding,combobox,bindingsource,.net,Winforms,Data Binding,Combobox,Bindingsource,我创建了以下类来模拟一个人: namespace DataBindingTest { public enum colorEnum { Red, Green, Yellow, Blue, } class Person { private string _Name; private int _Age; private colorEnum _Favo

我创建了以下类来模拟一个人:

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。要做到这一点,我必须:

在我的表单中添加了一个comboBox comboBoxPeople、一个NumericUpDown控件、一个复选框和另一个comboBox ComboxFavoriteColor。 从上面声明的MyPerson类创建了一个新的数据源 将BindingSource添加到我的表单中 将BindingSource的DataSource属性设置为2中定义的DataSource。 将comboBoxPeople的数据源设置为BindingSource,将DisplayMember设置为BindingSource的Name属性 我已将BindingSource的Age属性绑定到NumericUpDown控件,并将BindingSource的HasAllergies属性绑定到checkBox控件 在我的构造函数中,我创建了一个包含3个Person对象的数组,定义了它们的所有属性,然后将BindingSource的DataSource属性设置为此数组
到目前为止,一切都按预期进行。现在,我想在comboBoxFavoriteColor中显示此人最喜欢的颜色,即BindingSource的FavoriteColor属性。我已经将DropDownStyle设置为DropDownList,因为FavoriteColor是一个枚举。但是,当我从comboBoxPeople中选择一个人时,我不清楚应该如何绑定此comboBox,以便它1包含FavoriteColor枚举值,2将适当的颜色设置为SelectedItem。有人能给我一个想法吗?非常感谢

您需要按照以下思路做一些事情:

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

…为了让事情变得更简单,只需将最喜欢的颜色存储为type string而不是colorEnum,您可以按照Tom的建议执行,但至少有一种简单的方法可以做到这一点,而无需将Person.FavoriteColor更改为字符串

向名为FavoriteColorString的人员添加属性:

重新编译,使新属性显示在bindingsource中

现在将comboBoxFavoriteColor.SelectedItem绑定到FavoriteColorString

在运行时,按照Tom说的做:

comboBoxFavoriteColor.DataSource = Enum.GetNames(typeof(colorEnum));
瞧!它现在应该按照你想要的方式工作


在持久化设置对象时,只需不持久化FavoriteColorString属性

谢谢,这将使用颜色枚举中的颜色填充comboBoxFavoriteColor。但是当我在comboBoxPeople中选择一个人时,我仍然需要在ComboxBox中显示所选的颜色。我通过简单地指定控件的Value属性应该绑定到bindingSource1-Age,将Age映射到NumericUpDown控件。不过,这似乎对颜色组合框不起作用。我可以选择person 1并将他们最喜欢的颜色设置为红色。但是当我改为person 2时,颜色组合框仍然设置为红色。我希望它更新以显示此人的颜色。这正是我希望它的工作方式!:-在同一个周末,你两次给了我一个完美的解释,解释了我想做的事情。我衷心感谢你!我的荣幸。谢谢你写得好的问题!当枚举包含DescriptionAttributes时,您知道如何实现这一点吗?当我这样做时,setter中的值似乎是实际枚举值+DescriptionAttribute的组合,这似乎会导致异常,因为在枚举中找不到该值。我不知道为什么会发生这种情况。你的代码一定有我不知道的地方。你能给我看一下枚举声明或它的一部分吗?我试过了,但是DescriptionAttributes并没有对我产生任何影响。我的项目中似乎有些东西被破坏了。我注意到表单将不再在设计器中正确显示。所以我基本上重新创建了我的项目,现在一切正常。谢谢你的回复,谢谢你的帮助!
comboBoxFavoriteColor.DataSource = Enum.GetNames(typeof(colorEnum));