2011-12-22 12 views
1

私はaspxページを持っています。私は、動的にプレースホルダにWebユーザコントロールを追加しています。私は1つのユーザーコントロールのキャンセルボタンがあり、そのキャンセルボタンをクリックすると、aspxページ(プレースホルダー)内の他のユーザーコントロールをロードしたいと知っています。Webユーザコントロールから親aspxページの機能を呼び出す

私はusercontrolでイベントハンドラを作成してnullになるとどうすればいいですか?

おかげ

+0

動的にページにユーザーコントロールを追加する場所のコードを表示できますか。 – Jamiec

+2

あなたのコントロールはあなたのページを知るべきではありません。 – Oded

答えて

6

ユーザーコントロールは、ページが存在する場所に決して依存することはありません。コントロールにイベントを追加し、キャンセルボタンイベントハンドラから発生させます。

public event EventHandler CancelClicked; 

protected Cancel_Click(object sender, EventArgs e) 
{ 
    if(CancelClicked != null) 
    { 
    CancelClicked(this, e); 
    } 
} 

ページから、コントロールのCancelClickedイベントを購読し、その他のユーザーコントロールで実行する操作を行います。

+0

タイトカップリングについてのコメントは+1です。 – seanxe

+0

@Anders Abel私はすでにこのようにしています。私の場合、デバッガはif(CancelClicked!= null)の中に決して入力していません。 { CancelClicked(this、e); } 私のcancelclickedは常にnullであるため –

+1

コントロールをページに追加すると、OnCancelClickedでイベントハンドラを登録する必要があります。コントロールの定義は次のようになります。 '

2

私はこれを達成するための最良の方法は、あなたはそれが通信する必要がある場合、そのページにあなたがこのイベントを購読することができ解雇されたユーザーコントロールでイベントを作成すると考えています。

ユーザーコントロール

イベント変数として、あなたのコントロールでこれを入れてください。キャンセルボタンのクリックイベントで次に

public event EventHandler CancelRequested; 

CancelRequested(this, new CommandEventArgs("CancelClicked", SomeVariable)); 

ページ(または親)あなたが動的に追加するとき

が続いて(このような親ページ内のイベントにサブスクライブそれ):

ctrlYourControl.CancelRequested += new EventHandler(ctrlYourControl_CancelRequested); 

イベントを宣言するハンドラ:

void ctrlYourControl_CancelRequested(object sender, EventArgs e) 
{ 
    // display other user control 
} 
+0

ctrlYourControl.CancelRequestedとタイプするとタブタブを押すことができ、残りは自動的に行われます。 – ThePower

+0

私はすでにこのようにしています。私の場合、デバッグがCancelRequestedに到達しました(これは、新しいCommandEventArgs( "CancelClicked"、SomeVariable))。 CommandEventArgsを使用していくつかの有用な情報を渡すために、参照番号 –

+0

+1を返します。 – iMatoria

2

は、ユーザーコントロールにこのイベントを追加します。

public event EventHandler CancelClicked; 

今、あなたの親aspxページでこの方法。

public void OnCancelClicked (object sender, EventArgs data) 
{ 
    // do your stuffs like loading other controls and 
    // whatever when event fired 
} 

あなたが動的にユーザーコントロールをロードしている、この追加:これが何をすべき

public void btnCancel_Click(object sender, EventArgs e) 
{ 
    if(CancelClicked != null) 
    { 
     CancelClicked(this, e); 
    } 
} 

var someControl = LoadControl(@"~\SomeControl.ascx") as SomeControl; 
someControl.CancelClicked += new EventHandler(OnCancelClicked); 

そして、あなたのユーザーコントロール上を!