我在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集合中以及如何解决这个问题?
答案 0 :(得分:3)
在表单和控件处于Created
状态之前,在表单和控件可见之前,数据绑定不起作用,它们不在Created
状态。
这里的问题是由于上述事实。您正在使用数据绑定将项目添加到构造函数中的第一个组合中,如上所述,数据绑定将无法在那里工作,因此在循环中,第一个组合的Items
集合是空的,没有项目将是添加到第二个组合。
您可以使用以下任一选项解决问题:
Items
:box.Items.AddRange(MyList.ToArray());
Shown
或Load
事件中。Items
之前,使表单可见。例如,在将值分配给第一个组合的this.Show();
后调用DataSource
。调用this.Show();
或this.Visible = true;
会导致表单及其所有可见控件获得Created
。因此控件应该是可见的,并且应该是可见形式的可见部分的成员。