自定义Winforms ComboBox,硬编码项目也可以通过设计工具添加



问候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;
  }
}

相关内容

最新更新