2

非仮想プロパティ (「コントロール」) を持つ別のクラスから継承するクラスがあります。

このプロパティを上書きできないため、プロパティに関連付けられた「new」キーワードを使用しています。

実行時に、このプロパティは、正しいコンテキストで必要に応じて呼び出されます。

デザイナーからフォームを開くと、デザイナーは「新しい」コントロールではなく base.Controls を呼び出します。

何か不足していますか、それとも winforms デザイナーの動作が正しくないのでしょうか?

編集、詳細な説明のために問題のコードを追加しました。私は次のクラスを持っています:

public partial class BauerGroupBox : ComponentFactory.Krypton.Toolkit.KryptonGroupBox
   {
      public BauerGroupBox()
         : base()
      {
      }
      public new Control.ControlCollection Controls
      {
         get
         {
            MessageBox.Show("GOT THERE");
            return this.Panel.Controls;
         }
      }
   }

私のinitializecomponentで次のコードに到達すると:

BauerGroupBox thisBox = new BauerGroupBox()
thisBox.Controls.Add(something)

コードに新しい「BauerGroupBox」を追加すると、正常に動作します。ただし、デザイナーでコードを開くと (devenv のデバッグを使用している場合でも)、メッセージ ボックスは表示されず、ブレークポイントはヒットしません。

アプリを実行すると、ブレークポイントにヒットします。

4

3 に答える 3

3

何かが欠けています-あなたが説明しているのは正しい動作です。

Controls回避策は、 への呼び出しの直後に新しいプロパティを再設定することInitializeComponent()です。そのようです:

public MyForm()  {
    InitializeComponent();
    this.Controls.AddRange( base.Controls );
}

しかし、なぜControlsプロパティを「オーバーライド」しようとしているのですか? どのような新しい非標準的な動作を求めていますか? より良い代替手段があると思います。

于 2012-09-19T16:07:05.177 に答える
1

私はあなたの状況を理解していると思うので、デザイナーが何をしているのか説明させてください:

まず、実行時に、BauerGroupBoxコントロールのインスタンスを効果的に実行しています。(そうは言ってもControls、この派生型の参照、つまり を介してプロパティにアクセスしている可能性が高くBauerGroupBox、@Mystere Man が正しく主張しているように、メンバーBauerGroupBox.Controlsは継承されたメンバーを非表示にします (最後に定義された場所はどこでも)-そうではありません)それをオーバーライドします。

問題の問題は、設計時に、コントロールのデザイナーで、のインスタンスを「実行」していないことです。 .BauerGroupBoxBauerGroupBoxdesigningComponentFactory.Krypton.Toolkit.KryptonGroupBox

繰り返しますが、 のデザイナーにはrunningBauerGroupBoxのインスタンスはありませんが、 のインスタンスがあります。デザイナーには存在しません。BauerGroupBoxComponentFactory.Krypton.Toolkit.KryptonGroupBoxBauerGroupBox

ここで、もう少し混乱を招くようにします (実際には何もありません。少し考えてみれば、すべて非常に単純です)。他のコントロールの他のデザイナーに行って、フォームを言ってから、のインスタンスをドラッグ アンド ドロップし、BauerGroupBoxそれにいくつかのコントロールを追加すると、メッセージ ボックスが表示されます。その場合、「ランタイム」の場合と同様に、効果的にホストしていることを意味しますBauerGroupBox。この場合、あなたは設計していませんBauerGroupBox

他の @Dai が述べたように、あなたがしようとしているのが、人々がコントロールを追加できないようにすることである場合は、他の設計計画に従う必要があります。たとえば、

protected virtual Control.ControlCollection CreateControlsInstance();

方法。

于 2012-09-19T16:34:50.473 に答える
1

新しいキーワードの仕組みを誤解しています。New はプロパティをオーバーライドせず、非表示にします。オブジェクトを基本要素として参照すると、新しいプロパティではなく基本プロパティが呼び出されます。新しいものを使用する唯一の方法は、それを新しいものとして参照することです。すなわち。

public class A {
    public A1 {get;set;}
}

public class B : A {
    public new A1 {get;set;}
}

B b = new B();
A a = b;

a.A1; // references A.A1
b.A1; // references B.A1
于 2012-09-19T16:17:30.840 に答える