在Form Load之前,数据绑定不起作用 – 仅在Form加载后初始化ComboBox项
我在winform上有两个ComboBox,一个包含List“MyList”中的所有值,另一个我希望从第一个选定索引中获取所有值。 但我认为将项目加载到ComboBox中时会出现问题。
public partial class Form1 : Form { public Form1() { ComboBox box = new ComboBox(); box.DropDownStyle = ComboBoxStyle.DropDownList; box.DataSource = MyList.ToList(); box.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); Tab_Page.Controls.Add(box); ComboBox box2 = new ComboBox(); box2.DropDownStyle = ComboBoxStyle.DropDownList; foreach (object o in box.Items) { box2.Items.Add(o); } Tab_Page.Controls.Add(box2); box2.Items.RemoveAt(0); //This last line throws an error //"InvalidArgument=Value of '0' is not valid for 'index'." }}
该错误是因为box2在其集合中没有项目,即使box在此错误被抛出时具有List中的所有值。
所以我想知道如何/何时将项目加载到Items集合中,我该如何解决这个问题?
在表单和控件处于“已Created
状态之前,在表单和控件可见之前,数据绑定将不起作用,它们不处于“已Created
状态。
这里的问题是由于上述事实。 您正在使用数据绑定将项目添加到构造函数中的第一个组合,并且如上所述,数据绑定将无法在那里工作,因此在循环中,第一个组合的Items
集合是空的,并且没有项目将添加到第二个组合。
您可以使用以下任一选项解决问题:
- 直接向第一个组合的
Items
添加值:box.Items.AddRange(MyList.ToArray());
- 将代码放在表单的“已
Shown
或“Load
事件中。 - 在尝试检索第一个组合的
Items
之前使表单可见。 例如调用this.Show();
将值分配给第一个组合的DataSource
之后。 调用this.Show();
或者this.Visible = true;
导致窗体及其所有可见控件都被Created
。 因此控件应该是可见的,并且应该是可见forms的可见部分的成员。