在WinForms构建期间增值两次

时间:2011-09-07 20:30:31

标签: 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”(第一个和最后一个)。为什么会发生这种情况,我该如何解决?

1 个答案:

答案 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; }
}