1

问候溢出用户,

我创建了一系列自定义 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 属性。

4

1 回答 1

1

我必须非常努力地解释为什么项目以这种方式显示在设计器中,但我认为知道这与代码也在设计时运行的事实有关。

防止这种情况的方法是将您置于覆盖范围内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;
  }
}
于 2011-11-05T18:53:51.740 回答