【问题标题】:.NET WinForms combobox bindingsource and databinding question.NET WinForms 组合框 bindingsource 和 databinding 问题
【发布时间】:2011-10-17 03:08:11
【问题描述】:

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

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. 在我的表单中添加了一个组合框 (comboBoxPeople)、一个 NumericUpDown 控件、一个复选框和另一个组合框 (comboBoxFavoriteColor)。
  2. 从上面声明的我的 Person 类创建了一个新的 DataSource
  3. 在我的表单中添加了一个 BindingSource
  4. 将 BindingSource 的 DataSource 属性设置为 #2 中定义的 DataSource。
  5. 将 comboBoxPeople 的 DataSource 设置为 BindingSource,将 DisplayMember 设置为 BindingSource 的 Name 属性
  6. 我已将 BindingSource 的 Age 属性绑定到 NumericUpDown 控件,并将 BindingSource 的 HasAllergies 属性绑定到 checkBox 控件
  7. 在我的构造函数中,我创建了一个包含 3 个 Person 对象的数组,定义了它们的所有属性,然后将 BindingSource 的 DataSource 属性设置为这个数组

到目前为止,一切都按预期进行。现在我想在 comboBoxFavoriteColor 中显示该人最喜欢的颜色(即 BindingSource 的 FavoriteColor 属性)。我已将 DropDownStyle 设置为 DropDownList,因为 FavoriteColor 是一个枚举。但是,我不清楚我应该如何绑定此组合框以使其 1) 包含 FavoriteColor 枚举值和 2) 当我从 comboBoxPeople 中选择一个人时,将适当的颜色设置为 SelectedItem。谁能给我一个想法?非常感谢!

【问题讨论】:

    标签: .net winforms data-binding combobox bindingsource


    【解决方案1】:

    您需要按照以下方式做一些事情:

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

    ..为了方便起见,只需将最喜欢的颜色存储为类型 string 而不是 colorEnum

    【讨论】:

    • 谢谢,comboBoxFavoriteColor 填充了颜色枚举中的颜色。但是当我在comboBoxPeople中选择一个人时,我仍然需要让选择的颜色显示在组合框中。我通过简单地指定控件的 Value 属性应绑定到 bindingSource1 - Age 将 Age 映射到我的 NumericUpDown 控件。不过,这似乎不适用于颜色组合框。我可以选择人 1 并将他们最喜欢的颜色设置为红色。但是当我更改为第 2 个人时,颜色组合框仍设置为红色。我希望它更新以显示该人的颜色。
    【解决方案2】:

    您可以按照 Tom 的建议进行操作,但至少有一种简单的方法可以做到这一点,而无需将 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 属性。

    【讨论】:

    • 这正是我想要的方式! :-) 那是在同一个周末你给我一个完美解释我试图做的事情的两次。衷心感谢您!
    • 我的荣幸。感谢您提出的精心编写的问题!
    • 当枚举包含 DescriptionAttributes 时,您知道如何进行这项工作吗?当我这样做时,setter 中的值似乎是实际枚举值 + DescriptionAttribute 的组合,这似乎导致异常,因为在枚举中找不到“值”。
    • 我想不出为什么会这样。必须有一些我不知道你的代码的东西。你能告诉我枚举声明(或其中的一部分)吗?我试过了,DescriptionAttributes 对我没有任何影响。
    • 我的项目中似乎有些东西已经损坏。我注意到表单将不再在设计器中正确显示。所以我基本上重新创建了我的项目,现在一切正常。感谢您的回复,感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2016-01-27
    相关资源
    最近更新 更多