Добавленная стоимость дважды при создании WinForms - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть следующий код в 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 Ответ

2 голосов
/ 08 сентября 2011

Это происходит потому, что конструктор также выполняется во время разработки.Поэтому, как только вы поместите свой пользовательский комбинированный список в форму, он сразу же заполняется 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...