【问题标题】:Trying to bind a combobox to an enum in C#尝试将组合框绑定到 C# 中的枚举
【发布时间】:2018-06-25 16:31:17
【问题描述】:

我有一个包含枚举属性的类:

public RaTypes RaBucket1Type { get; set; }

我的枚举是:

    public enum RaTypes
{
    Red,
    Yellow
}

我能够将表单的组合框数据源绑定到枚举,这样当我单击下拉菜单时,我会看到枚举:

cmbBucket1Type.DataSource = Enum.GetValues(typeof(RaTypes));

当我加载表单时,我想用现有值填充组合框。我尝试了以下方法:

        cmbBucket1Type.DisplayMember = "TradeType";
        cmbBucket1Type.ValueMember = "TradeEnumID";
        cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;

但这不起作用。

另外,我也不确定是否正确实现了 ValueChanged 事件处理程序:

EditedAlgorithm.RaBucket1Type = (RaTypes)((ComboBox)sender).SelectedItem;

谁能帮我理解:

  1. 如何将组合框设置为当前值,以及
  2. 如何处理事件处理程序以便我可以将属性设置为所选择的任何内容?

谢谢 -埃德

更新 我试过了

    cmbBucket1Type.SelectedIndex = cmbBucket1Type.FindString(EditedAlgorithm.RaBucket1Type.ToString());

    cmbBucket1Type.SelectedItem = EditedAlgorithm.RaBucket1Type;

都不行。

【问题讨论】:

  • 这是 Windows 窗体对吗?
  • 问题当我加载表单时,我想用现有值填充组合框。 没有多大意义。在ComboBox 中,世界populate 意味着ComboBox 添加项目。您是否尝试选择加载时显示的最后一个值?
  • 我想:当表单加载时,添加现有类属性的值。当用户单击向下箭头时,会提供(显示)所有枚举值。
  • 是的,Windows 窗体。

标签: c# combobox


【解决方案1】:

我认为您使用的术语与正常情况略有不同,因此难以理解。

通常,术语 AddPopulateSelect 用于表示以下含义:

  • 添加 - 将一个项目添加到组合框中的现有项目集中。
  • 填充 - 使用一组项目初始化组合框。
  • 选择(显示) - 从组合框中的多个项目中选择一项作为选定项目。通常该项目会显示在组合框可见区域中。

在澄清了这一点后,我假设您想要执行以下操作。

  1. 最初填充ComboBox 具有一组值。在您的情况下,RaTypeEnum 的值。
  2. 创建一个包含上述属性的类的实例。由于您没有命名该类,因此我将其命名为 SomeClass
  3. 使用您选择的enum 值初始化所述类实例的RaBucket1Type 属性。我将它初始化为Yellow
  4. 在启动时有ComboBox选择该值。
  5. Form_Load 之后,在任何给定时间,如果用户更改ComboBox 的值,则更改会反映在您的类实例属性中。

为此,我会这样做:

public partial class MainForm : Form
{
    // Your class instance.
    private SomeClass InstanceOfSomeClass = null;

    public MainForm()
    {
        InitializeComponent();
        // Initialize the RaBucket1Type property with Yellow.
        InstanceOfSomeClass = new SomeClass(RaTypes.Yellow);
        // Populating the ComboBox
        comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));
    }

    // At selected index changed event
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Get the selected value.
        var selected = comboBox1.SelectedValue;
        // Change the `RaBucket1Type` value of the class instance according to the user choice.
        InstanceOfSomeClass.RaBucket1Type = (RaTypes)selected;
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        // At form load time, set the `SelectedItem` of the `ComboBox` to the value of `RaBucket1Type` of your class instance.
        // Since we initialized it to `Yellow`, the `ComboBox` will show `Yellow` as the selected item at load time.
        if (InstanceOfSomeClass != null)
        {
            comboBox1.SelectedItem = InstanceOfSomeClass.RaBucket1Type;
        }
    }
}

public enum RaTypes
{
    Red,
    Yellow
}

public class SomeClass
{
    public RaTypes RaBucket1Type { get; set; }

    public SomeClass(RaTypes raTypes) { RaBucket1Type = raTypes; }
}

请记住,这是一个向您展示如何处理这种情况的基本示例,而不是完整的完成代码。您需要进行一系列错误检查以确保类实例和选定项不为空等。

【讨论】:

  • 谢谢!...我实际上已经尝试过(SelectedItem=...),但由于某种原因它不起作用。我将进行更多调试并发布我发现的内容(希望是答案)。我在调试期间注意到的非常奇怪的方面是,当我通过分配其数据源(如上所示)填充组合框时,我看到类属性发生了变化。非常奇怪的行为,因为两者不应该相关。我喜欢/讨厌这些错误 :)
【解决方案2】:

我找到了答案:

我的 SelectedIndexChanged 事件指向我的事件处理程序,这意味着当我使用以下方法将项目“添加”到 ComboBox 时:

comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));

它触发了事件处理程序,并重置了我的类属性。我的事件处理程序是这样的:

var selectedValue = cmbBucket1Type.SelectedValue;

所以简单的解决方案是:

  1. 从 Visual Studio GUI 中删除硬编码的事件处理程序。
  2. 在代码中添加以下事件处理程序之后我分配了数据源

    bucketType1.SelectedIndexChanged += BucketTypeChanged;

这行得通。

谢谢大家的帮助!!

-埃德

【讨论】:

  • 如果您需要重新加载您的comboBox1,您可以-=禁用更改的事件处理程序,重新加载,+=启用更改的事件处理程序。确保 Not have multiple += hooks for the event handler by -= 首先删除事件处理程序。
【解决方案3】:

您可以像这样设置 selectedValue

cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;

当组合改变如下时,您可以处理选定的值:

        private void cmbBucket1Type_SelectedValueChanged(object sender, EventArgs e)
    {
        var selectedValue = cmbBucket1Type.SelectedValue;
    }

【讨论】:

  • 感谢您的回复,但我看不出您的建议与我所说的我尝试过但没有奏效的内容有什么不同? “cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;”正是我尝试过的......有错字吗??
猜你喜欢
  • 2018-11-12
  • 2020-02-07
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多