1

オーバーフローユーザーの皆さん、

一連のカスタムComboBoxコントロールを作成しました。これには、常にハードコードされたアイテムが含まれている必要があります。カスタムコントロールには、選択したアイテムに相当するEnumを返すGetEnumプロパティもあります。

このコントロールの簡単な例は、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}

さて、これはかなり簡単で、うまく機能しているようです。

奇妙なことに、Designerはこれを理解し、Designerレベルでこれらのアイテムを再度追加しているようです。さらに奇妙なことに、初めてデザインビューを作成または開いたときに、アイテムが追加されているようです。私はそのパターンを完全には理解していません。

とにかく、要点は、設計コードは最終的に次のステートメントを取得するということです。

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

もちろん、これはかなり面倒です。私の質問には2つの部分があります。

1)なぜこれが起こっているのですか?

2)どうすればそれを防ぐことができますか?

this.Itemsプロパティをオーバーライドしてプライベートにするか、そうでなければ機能しないようにしてみましたが、エラーが発生しました。このカスタムコントロールを操作する唯一の方法は、SelectedBooleanプロパティを使用することです。

4

1 に答える 1

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;
  }
}
于 2011-11-05T18:53:51.740 に答える