我在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"(第一次和最后一次)。为什么会发生这种情况,我该如何解决它?
这是因为构造函数也在设计时执行。因此,只要您将自定义组合框放在表单上,它就会立即填充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; }
}