Пользовательский Winforms ComboBox, жестко закодированные элементы также добавляются через инструмент дизайна
Привет пользователям переполнения,
Я создал серию пользовательских элементов управления 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.I tems и сделать его приватным или иначе заставить его не работать, но это дало ошибку. Единственный способ, которым я собираюсь взаимодействовать с этим пользовательским элементом управления, - это свойство SelectedBoolean.
1 ответ
Мне пришлось бы очень серьезно подумать, чтобы объяснить, почему именно элементы отображаются в конструкторе таким образом, но я думаю, что достаточно знать, что это связано с тем, что код также выполняется во время разработки.
Способ предотвратить это - переопределить 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;
}
}