问候Overflow用户,
我创建了一系列自定义的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}
现在,这是相当直接的,似乎工作得很好。
奇怪的是,设计器似乎发现了这一点,并在设计器级别再次添加了这些项。更奇怪的是,当我第一次构建或打开Design视图时,它似乎添加了这些项。我还没完全弄明白这个模式。 无论如何,关键是,Design代码最终将获得这个语句: this.myBooleanDropDown.Items.AddRange(new object[] {
">",
">=",
"=",
"<=",
"<",
"!=",
">",
">=",
"=",
"<=",
"<",
"!="});
当然,这是相当烦人的。我的问题有两个部分:
1)为什么会发生这种情况?
2)如何预防?
我尝试重写this。Items属性并将其设为私有,或者使其不工作,但这会给出一个错误。我打算与这个自定义控件交互的唯一方法是通过SelectedBoolean属性。
我必须非常努力地解释为什么项目在设计器中以这种方式显示,但我认为这足以知道这与代码在设计时也运行有关。
防止这种情况的方法是将您的InitLayout
置于覆盖中,使您仅在非设计模式下运行它(并非控件中的所有代码都是设计模式感知的,但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;
}
}