2017-03-26 10 views
0

私はLabelクラスを拡張していますプロパティへの参照がある場合、包含オブジェクトへの参照を取得する方法はありますか?次のように

public class MyLabel: Label { 
    public Button btn; 
    public string mydata; 
} 

を私のメインプログラムでは、私は新しいインスタンスをインスタンス化:

MyLabel lbl = new MyLabel(); 
lbl.mydata = "some data here"; 
lbl.btn = new Button(); 
lbl.btn.Click += new EventHandler(button_pressed); 

this.Controls.Add(lbl); // Adds the label to the form 
this.Controls.Add(lbl.btn); // Adds the button to the form 

をそして私は、ボタンのクリックイベントを処理するメソッドを作成しました:

void button_pressed(Object sender, EventArgs e) { 
    Button btn = (Button)sender; 
    //Now I have an access to the property within MyLabel instance. 
    // but how can I access the parent object? 
    // I need to access the sibling property [mydata] string from here 

    btn.Siblings["mydata"] = "some other thing" ; //Something like this 

    MyLabel lbl = btn.ParentObject(); //Or something like this 
    lbl.mydata = "Some other thing"; 

} 
+0

親ラベルクラスへの参照を保持する拡張ボタンクラスを作成する必要があります –

+0

なぜUserControlを記述しませんか? – Steve

答えて

2

これはユーザーコントロールButtonクラスの拡張のいずれかに行くには良い方法かもしれません、その場合にはリサイズ、のように見えます - ちょうど維持親への参照(のUserControlと少し複雑ですが、そのコントロールでclickイベントを定義する必要があります。そうでない場合は、「square 1」に戻ります)Tagプロパティソリューションがwええと、追加のキャストがありますが、タイプの安全性の保証はありません(Tagobjectなので、アクセスしようとすると何でも構いません)。

しかし、より一般的な解決策を探しているとしましょう。問題のクラスがsealedであり、Tagまたは類似の目的のプロパティがなく、Controlsコレクションが利用できない(または、パフォーマンス上の理由からループしていないことが望ましい)としましょう。私の最善の知識では、親オブジェクトを特定することはできません。しかし、あなたは簡単に親にButtonをマッピングし、自分自身の「コントロール」スタイル辞書を提供することができます。

public class MyLabel: Label { 
    public static Dictionary<Button, MyLabel> ParentMap = new Dictionary<Button, MyLabel>(); 

    public Button btn; 
    public string mydata; 

    public void AddToParentMap() => ParentMap[btn] = this; 
} 

あなたがMyLabelのインスタンスを作成しているときに、ちょうどAddToParentMap()関数を呼び出す(constructorで行うことができませんthisポインタが使用できないため、オブジェクト)が作成されるまで:

MyLabel lbl = new MyLabel(); 
lbl.AddToParentMap(); 

あなたはその後、ちょうどそれを調べることができ、迅速かつ簡単に、あなたのクリックイベントに:

void button_pressed(Object sender, EventArgs e) { 
    Button btn = (Button)sender; 
    var label = MyLabel.ParentMap[btn]; 

    //... 
    //Your code... 
} 

Tagのソリューションとは異なり、タイプの安全性が保証されています。MyLabelオブジェクトにアクセスしていることは常に知っています。

+0

あなたは私の懸念事項のすべてを1つの投稿にまとめました – Ahmad

0

ボタンインスタンスからアクセスすることはできませんが、できることはからMyLabelを取得することですコレクション:

var lbl = this.Controls.OfType<MyLabel>().FirstOrDefault(c => c.btn == btn); 
0

Tagプロパティを使用できます。

lbl.btn = new Button(); 
lbl.btn.Tag = lbl; 

そして、あなたがそれを必要とする:

Button btn = (Button)sender; 
Label lbl = (MyLabel)btn.Tag; 
+0

'Label lbl =(MyLabel)btn.Tag;'は 'InvalidCastException'をスローすることができます。' Tag'は一般的な使用プロパティである 'object'型のままであることを保証する方法がないためです。この場合は「クイックフィックス」として機能しますが、大きなアプローチではありません。 – CoolBots

関連する問題