2012-02-22 9 views
0

私はToolStripLabelを継承しようとしています:コンストラクタでコントロールのプロパティを設定する方法(デザイナーとの問題)

public class SeparatorLabel : ToolStripLabel 
{ 
    public SeparatorLabel() : base() 
    { 
     Margin = new Padding(5, 0, 5, 0); 
     Text = "ABC"; 
    } 
} 

をしかし、私は、フォーム上で、このようなコントロールを配置する場合は、Textプロパティがから取られますデザイナのプロパティグリッドに入力された値。

私のコンストラクタがプロパティグリッドのプロパティが設定される(フォームのInitializeComponent())前に呼び出されるので、これは当然予想されるので、私の値は上書きされます。

質問があります - 既存のコントロールから継承するときにこのような動作を実現するための標準的な練習は何ですか?

私はそれが空のセッターを含めるようにTextプロパティをオーバーライドすることだった、と私は、コントロールのTextを更新したいとき、私は手動でbase.Textを設定して実装した方法:

public class SeparatorLabel : ToolStripLabel 
{ 
    public SeparatorLabel() : base() 
    { 
     Margin = new Padding(5, 0, 5, 0); 
     base.Text = "ABC"; 
    } 

    [Browsable(false)] 
    public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set { } 
    } 
} 

これは動作しますが、私はそれがベストプラクティスかどうかはわかりません。私が必要とするものを達成するための従来の方法はありますか?

答えて

0

コンストラクタがクラスと異なるため、この例はコンパイルされません。

DesignerSerializationVisibility属性を見て、Hiddenに設定することもできます。

public SeparatorLabel() { 
    base.Margin = new Padding(5, 0, 5, 0); 
} 

[Browsable(false)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public new Padding Margin { 
    get { return base.Margin; } 
    set { 
    throw new Exception("This property is read only."); 
    } 
} 
+0

私の例でエラーを修正しました(私は自分のコードから直接コピーしていないので、無効なコンストラクタ名です)。 –

関連する問題