Пользовательский Winforms ComboBox, жестко закодированные элементы также добавляются через инструмент дизайна - PullRequest
1 голос
/ 05 ноября 2011

Привет пользователям переполнения,

Я создал серию пользовательских элементов управления ComboBox, которые должны иметь жестко закодированные элементы. Пользовательские элементы управления также имеют свойство GetEnum, чтобы возвращать эквивалент Enum выбранного элемента.

Простой пример этого элемента управления - версия ComboBox_Boolean.

public partial class ComboBox_Boolean : ComboBox
{
    public ComboBox_Boolean()
    {
        Initialize();
    }
    public void Initialize()
    {
        this.Items.Clear();
        foreach (string b in (new string[] { ">", ">=", "<=", "<", "=", "!="}))
            this.Items.Add(b);
        this.SelectedIndex = 0;
        this.DropDownStyle = ComboBoxStyle.DropDownList;
    }

    public BooleanType SelectedBoolean() { Get{//foo} Set{//foo}}
}
public Enum BooleanType {LT, LE, GE, GT, EQ, NE}

Теперь, это довольно просто, и, кажется, работает просто отлично.

Что странно, так это то, что Дизайнер, похоже, подхватил это и добавил эти элементы снова на уровне Дизайнера. Для большей странности кажется, что элементы добавляются при первом создании или открытии представления «Дизайн». Я не совсем понял схему.

В любом случае, смысл в том, что код проекта в конечном итоге получит это утверждение:

        this.myBooleanDropDown.Items.AddRange(new object[] {
        ">",
        ">=",
        "=",
        "<=",
        "<",
        "!=",
        ">",
        ">=",
        "=",
        "<=",
        "<",
        "!="});

Это, конечно, довольно раздражает. Мой вопрос состоит из двух частей:

1) Почему это происходит?

2) Как я могу предотвратить это?

Я попытался переопределить свойство this.Items и сделать его приватным, или иначе заставить его не работать, но это дало ошибку. Единственный способ, которым я собираюсь взаимодействовать с этим пользовательским элементом управления, - это свойство SelectedBoolean.

1 Ответ

1 голос
/ 05 ноября 2011

Мне пришлось бы очень усердно объяснить, почему именно элементы отображаются в конструкторе таким образом, но я думаю, что достаточно знать, что это связано с тем, что код также выполняется во время разработки.

Способ предотвратить это - переопределить значение InitLayout, которое позволяет запускать его только в не режиме разработки (не весь код в элементе управления поддерживается DesignMode, но InitLayout -):

protected override void InitLayout()
{
  base.InitLayout();
  if (!DesignMode)
  {
    this.Items.Clear();
    foreach (string b in (new string[] { ">", ">=", "<=", "<", "=", "!=" }))
      this.Items.Add(b);
    this.SelectedIndex = 0;
    this.DropDownStyle = ComboBoxStyle.DropDownList;
  }
}
...