2011-09-14 8 views
1

私はaspxファイルを持っていて、その中にはascxコントロールがレンダリングされています。親のイベントにどのように接続できますか?

aspxファイルにはボタンがあり、クリックするとイベントが発生します。

私はascxコントロールに同じイベントに接続したいボタンがありますが、どうやって行うのかは分かりません。私は明らかにかなり初歩的なものを欠いている。

私はそれがこのようなものになるだろう考えていた:

myButton.Click += new EventHandler(btn_Click); 

... 

void btn_Click(object sender, EventArgs e) 
{ 
    <some way to get ahold of the parent aspx>.btn_Click(sender, e) 
} 

しかし、私は私が間違ってツリーを吠えてるなら、私は思ってしまうた、これまで運がなかったしました。

アイデア?

+1

ロジックを別のクラスにカプセル化して、どちらの場合でも呼び出すのはなぜですか? – V4Vendetta

+0

親ページのすべての値を取って保存するのはそれほど複雑なロジックではないからです。したがって、ロジックを他の場所にカプセル化することは、大量の値を送信し、あまりコードを実行しないことを意味します。 – Beska

+0

親ページのボタンにアクセスできますか? – sll

答えて

2

あなたはこのように、ユーザーコントロールのイベントハンドラを作成する必要があります。

ASCXマークアップ:

<asp:Button ID="UserControlButton" runat="server" OnClick="UserControlButton_Click" /> 

ASCXコードビハインド:

public event EventHandler ButtonClick; 

protected void UserControlButton_Click(object sender, EventArgs e) 
{ 
    if (ButtonClick != null) 
     ButtonClick(sender, e); 
} 

をページでは:

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" /> 
<uc:MyUserControl ID="UserControl1" runat="server" OnButtonClick="Button1_Click" /> 

I n個のページの背後にあるコード:ユーザーコントロールで

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //if you need to differentiate one button from the other 
    if (sender.Equals(Button1)) 
    { 
     //page button logic 
    } 
    else 
    { 
     //user control button logic 
    } 
} 
+0

私はあなたが質問のポイントを逃したことについてのコメントに正しかったと信じています、ありがとう – sll

+0

これはそれを釘付けにしました。私はそれが働いているかどうかは分かりませんが、私はまだ重要な要素を欠いていると思います。ユーザーコントロールのOnButtonClick属性は、名前を介して自動的にButtonClick EventHandlerに接続されますか?そうですか? Zow。私はここに私の知識に大きな穴があります。確かに戻ってギャップを埋める時間。 – Beska

+0

usercontrolのボタンがクリックされると、usercontrolのイベントハンドラが起動されます。このイベントハンドラは、ページ上のボタンのクリックイベントによって処理できる、ユーザーコントロールからイベントをページに公開します。私はそれが混乱していることを知っていますが、意味がありますか? –

0

追加:あなたの.aspxページを追加で

public Action<object,EventArgs> onMyButtonClick { get; set; } 

... 

protected void Page_Load(object sender, EventArgs e) 
{  
    btn.Click += (s,ea) => { onMyButtonClick(sender, e); }; 
}  

をこのような

protected Action<object,EventArgs> myClickAction = (s, a) => { /* your handling code goes here */ }; 

... 

protected void Page_Load(object sender, EventArgs e) 
{  
    myUserControlName.onMyButtonClick = myClickAction; 
    btn.Click += (s,ea) => { myClickAction(s,ea); }; 
} 

何かが動作するはずです。 (注:このコードはテストされておらず、調整が必要な場合があります

+0

私は、アクションデリゲートの代わりに 'EventHandler'を使用します。はい、それらは同等ですが、EventHandlerは何年もの間標準となっており、代わりにActionを使用するコードが複雑になります。 – Kasaku

+0

@PirateKitten私は、アクションを使用するとコードをより簡潔にすることができますが、私はコードを少し簡潔に更新しました。それはまた、プログラミングのより機能的なスタイルであり、私の意見ではより読みやすい。また、受け入れられた答えに気付くと、この作業を行うために4つのファイルに移動しなければなりません。私のソリューションでは、コードは2つしかありません。起こっていることを一目で見ることができます。 –

+0

あなたは* 4つのファイルに影響を与える*持っていない、あなたはアクションのやり方をしたようにCSのPage_Loadでハンドラに簡単に接続することができ、多くの人が行うことができます。 – Kasaku

関連する問題