在组合框中选择enum作为SelectedItem

时间:2013-10-18 17:19:35

标签: c# .net winforms

我很难在winforms组合框中选择合适的项目。之前我详细描述了here,但我认为问题仍然没有解决,因为我使用一个表单来添加/编辑记录。所以在表格加载方面我有

  private void AddEditForm_Load(object sender, EventArgs e)
  {
      PopulateComboBoxLanguage();
  }

private void PopulateComboBoxLanguage()
{
    comboBoxLang.DataSource = Enum.GetValues(typeof(Book.EnumLang));
}

在编辑操作上我想用现有数据填充表单,除了组合框之外,所有内容都应该填充,其中始终显示来自EnumLang的第一项。 从我的第二个构造函数我调用PopulateWithExisingData(book)我使用

comboBoxLang.SelectedItem = book.Language;

但即使传递book.Language设置为德语SelectedItem,在调试模式下也始终为空。

P.S。我尝试使用comboBoxLang.SelectedItem = (book.EnumLang)book.Language;和SelectedValue但仍保持不变。

再一次,我猜这个问题是在页面加载时填充组合框,但我不知道是不是以及如何解决这个问题。

请询问更多信息。

2 个答案:

答案 0 :(得分:2)

  1. 声明要在表单中添加/编辑的对象类型的实例。
  2. 将bool isEdit添加到表单并将其设置为false
  3. 添加方法public void Initialize(ObjectType name)
  4. 您的Initialize方法应该将表单实例设置为等于参数,并且应该设置一个布尔标志isEdit = true。
  5. 将所有加载数据/填充控件(如组合框)的代码放入表单加载事件中。
  6. 在加载事件的底部,填充控件后执行

        if (isEdit)
        {
            //Set your controls selected values from the object you are editing
        }
    
  7. 现在,对于新对象,只需制作表单并在其上调用Show或ShowDialog。这将导致Load事件触发,您的控件将填充。

    对于编辑,请制作表单,调用Initialize,然后执行Show / ShowDialog。由于您的Initialize方法设置了isEdit = true,因此将加载load事件底部的if(isEdit)代码块,并将控件值设置为等于您正在编辑的对象的属性。

    以下是一些非常简单的示例代码:

        public Form1()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //This is simulating an add...First Language will be displayed on form2, 
            //which is English
            Form2 form = new Form2();
            form.ShowDialog();
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
            //This is simulating an edit...this will display french 
            //(or whatever is passed in)
            Form2 form = new Form2();
            form.Initialize(Languages.French);
            form.ShowDialog();
        }
    

        Languages editValue;
        bool isEdit = false;
    
        public Form2()
        {
            InitializeComponent();
        }
    
        public void Initialize(Languages var)
        {
            editValue = var;
            isEdit = true;
        }
    
        private void Form2_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = Enum.GetValues(typeof(Languages));
    
            if (isEdit)
            {
                comboBox1.SelectedItem = editValue;
            }
        }
    

    public enum Languages
    {
        English = 0,
        French = 1,
        Spanish = 2,
        German = 3
    }
    

答案 1 :(得分:1)

设置DataSource时,会传递一个对象数组。 当您设置SelectedItem时,您传递一个枚举值,因此它再次被装箱到一个对象。 ComboBox使用方法IndexOf在DataSource值中搜索您的项目,该方法使用Object.Equals方法将这些值与新值进行比较。由于它们是不同的对象(引用不同),因此您的项目永远不会在DataSource集合中找到,因此选择不会更改。