あなたがやったことは大丈夫です-それらのコントロールのボタンをクリックしたときに発生するイベントを公開し、次に相互に参照を渡すことによってそれを行うことができます(それらをサブスクライブし、「this」コントロールをフェードするコードを記述します)。
ただし、これは単純なソリューションには少し手間がかかる可能性があります。
私があなたの解決策について言うことは、あなたがコントロールの名前を変更した場合、それは機能しなくなるということです。代わりに次のことができます。
var ba = this.Parent.Controls.OfType<ButtonAdvertisement>().FirstOrDefault();
そうすれば、コントロール名に縛られることはなくなりますが、コントロールのタイプに縛られることはありません。using System.Linq;
これを機能させるには、コードファイルにが必要です。もちろん、これは、親にそのコントロールタイプの他のインスタンスが1つしかないという事実に依存しています。
私が言及した最初のソリューションに興味がある場合は、このコードスニペットが次のことを示すのに役立ちます。
public class FadeControl {
public event EventHandler Clicked;
public void FadeOut(bool b){
}
public void AttachTo(FadeControl other){
//splitting this operation to a public and private allows us to
//initiate an attach publicly, but then recurse privately without
//causing a stack overflow
AttachToInternal(other);
other.AttachToInternal(this);
}
private void AttachToInternal(FadeControl other){
other.Clicked += Attached_Clicked;
}
protected virtual void Attached_Clicked(object sender, EventArgs e)
{
//fade me out
FadeOut(true);
}
// provides a way for the deriving class to raise the Clicked event
protected void OnButtonClicked(){
if(Clicked != null) Clicked(this, null);
}
}
public class ButtonDiscount : FadeControl {
Button _button;
//omitted: designer code
//this is your handler for the _button clicked event
private void _button_Clicked(object sender, EventArgs e){
//call the base class' OnButtonClicked method - to raise the event
OnButtonClicked();
//TODO: do work.
}
}
//omitted - code for the ButtonAdvertisement class
フォームにメンバーがいる_buttonAdvertisement
と仮定して、フォームにメンバーが初期化された後、フォームでそれを実行したら、次のようにします。_buttonDiscount
_buttonAdvertisement.AttachTo(_buttonDiscount);
そして、それはすぐに両方のコントロールを互いにバインドします。
注-以下のコメントに応えて-FadeControl
別のFadeControlのClicked
イベントを保護および仮想化するためにイベントハンドラーを作成したので、オーバーライドできます。