2015-10-04 54 views
4

我一直在C#(​​VS Express 2015)中编写应用程序,并且有一个组合框,我希望预先填充保存的值。我似乎无法让组合框取得我尝试设置的值。我创建了一个新项目来证明这个错误。C#组合框仅在调试中设置

主要代码如下。另一个文件声明tableLayoutPanel。 drawComboBox函数应该使用给定的选定选项和行向面板添加组合框。

public Form1() 
    { 
     InitializeComponent(); 
     drawComboBox(Options.Blue, 0); 
    } 

    public enum Options 
    { 
     Unset, 
     Blue, 
     Yellow, 
     Red 
    }; 

    private void drawComboBox(Options SelectedOption, int row) 
    { 
     System.Windows.Forms.ComboBox colorCombo = new System.Windows.Forms.ComboBox(); 
     colorCombo.DataSource = Enum.GetValues(typeof(Options)); 
     colorCombo.Name = "colorCombo"; 
     this.tableLayoutPanel1.Controls.Add(colorCombo, 0, row); 
     colorCombo.SelectedItem = Options.Yellow; 
    } 

怪异的一部分是,如果我运行正常调试模式或通过其单步组合框会一直显示程序“未设置”,但如果我打破了颜色设置,并在打开colorCombo项目之前本地调试窗口然后逐步完成,它将被正确设置。考虑到在调试器中查看问题解决了这个问题,这使得找出发生的事情变得非常痛苦。

我将不胜感激任何想法,谢谢。

+2

数据绑定,就像.NET中的许多事情一样,是懒惰地完成的。何时必须完成。延迟到实际创建基础本地组合框为止。您通过查看调试器中的Items属性确实强制执行此操作。或者在赋值之前添加'var dummy = colorCombo.Handle;'。干净的方法是在Load事件中。 –

回答

0

我不知道为什么发生这种情况,但我可以告诉你如何修复它 -

请改变这样&你绘制函数的步骤顺序它将很好地工作。

private void drawComboBox(Options SelectedOption, int row) 
    { 
     System.Windows.Forms.ComboBox colorCombo = new System.Windows.Forms.ComboBox(); 
     colorCombo.Name = "colorCombo"; 
     this.tableLayoutPanel1.Controls.Add(colorCombo, 0, row); 

     colorCombo.DataSource = Enum.GetValues(typeof(Options)); 
     colorCombo.SelectedItem = Options.Yellow; 


    } 

看来它依赖于这些两行代码的顺序

组合使得 “未设置”

 colorCombo.DataSource = Enum.GetValues(typeof(Options)); 
     this.tableLayoutPanel1.Controls.Add(colorCombo, 0, row); 

,如果你扭转它,它的工作原理

this.tableLayoutPanel1.Controls.Add(colorCombo, 0, row); 
     colorCombo.DataSource = Enum.GetValues(typeof(Options));