在WinForms构建过程中增加了两次价值



我在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; }
}

最新更新