2012-01-20 7 views
1

.NETフレームワーク内のいくつかのコントロールにいくつかのプロパティを追加したいと思います。 たとえば、何らかのリンクコントロールを作成するために、既存のコントロールを含むコントロールではなく、関連するコントロールのリストを追加したいとします。C#.NETのコントロールにプロパティを追加する

私がしたのは、Controlクラスから継承したコンクリートデコレータによって実装された、小さなインタフェースデコレータを作成することでした。ここでは、新しいプロパティとそのメソッドを管理するメソッドを示します。

主な問題は、私の装飾されたコントロールのインスタンスを作成するとき、私は基本コントロールのインスタンスをパラメータとして渡す必要があります - それはComboboxと言いましょう。デコレータクラス。

そのコンポーネントをペイントしようとすると、私はできません。また、理由も不明です。コントロールは表示されません。ここで

はデコレータコードです:

public class ControlDecorator : Control, IDecorator 
    { 
    private List<Control> RelatedControls = new List<Control>(); 
    private Control Control; 

    public ControlDecorator(Control c) 
    { 
     this.Control = c; 
     this.Control.MouseClick += new MouseEventHandler(Control_MouseClick); 
    } 

そして、ここでは、私がコントロールを作成する方法である:

Control lb = new Label(); 
    lb = new ControlDecorator(lb); 
    editableArea.Controls.Add(lb); 
    editableArea.Refresh(); 
+0

あなたの質問は何ですか? – Oded

+3

BTW - フィールドのひどい命名。 – Oded

+0

"Decorator"はGOTFのDecoratorパターンを使用するように聞こえるが、正しく実装されていない(継承は使用しないで、装飾されたオブジェクトへの参照を保持する) – Matten

答えて

1

あなたはのOnPaintメソッドをオーバーライドしませんでした?メソッドをオーバーライドする必要があります。コントロールクラスであいまいにするのではなく、フィールド名をわかりやすい名前に変更することができます。 OnPaint

Control Class documentaiotn

Over riding on paint method

+0

問題はそこにあると思っていた。私はそれを無効にしてControl-terribleという名前のフィールドをペイントするように指示しますが、私はそれをどうやって行うのか分かりません。 –

+0

@Ed。このリンクをチェックすると、それはあなたを助けるかもしれません –

0

あなたはControlDecoratorコンストラクタ内のInitializeComponent()メソッドを呼び出す必要があります。

public ControlDecorator(Control c) 
{ 
    InitializeComponent(); 
    this.Control = c; 
    this.Control.MouseClick += new MouseEventHandler(Control_MouseClick); 
} 
+0

あなたの助けに感謝しますが、動作していません。 –

0
public ControlDecorator(Control c) 
{ 
    this.Control = c; 
    this.Controls.Add(c); 
    this.Control.MouseClick += new MouseEventHandler(Control_MouseClick); 
} 
関連する問題