我在VS2010 Ultimate中有以下代码:
class MyComboBox : System.Windows.Forms.ComboBox
{
public MyComboBox() {
this.Items.Add("myValue");
this.Items.Add("myValue2");
this.Items.Add("myValue3");
this.Items.Add("myValueN");
}
// ...
}
当我运行示例WinForms应用程序时,控件的每个实例在下拉列表中都有两次“myValue”(第一个和最后一个)。为什么会发生这种情况,我该如何解决?
答案 0 :(得分:2)
这是因为构造函数也在设计时执行。因此,只要您将自定义组合框放在表单上,它就会立即填充4个值。然后将其保存在表单的InitializeComponent()方法中。下次运行表单时,构造函数会再次执行,向组合框添加4个值,然后InitializeComponent再添加4个。
解决这个问题的几种方法,但干净的方法相当痛苦。到目前为止,最简单的方法是延迟添加这些项,直到您可以测试DesignTime属性:
class MyComboBox : ComboBox {
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
if (this.Items.Count == 0) {
this.Items.Add("myValue");
this.Items.Add("myValue2");
this.Items.Add("myValue3");
this.Items.Add("myValueN");
}
}
}
如果无法编辑下拉列表中的项目,那么这是最好的解决方法:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public new ObjectCollection Items {
get { return base.Items; }
}