2009-09-11 14 views
9

私は、ユーザーコントロールからクリックイベントを発生させ、それを含むページで処理しようとしています。私が持っている問題は、ユーザーコントロールの 'imgstep1'ボタンをクリックすると、imgstep1_clickイベントの背後にあるコードがトリガされますが、 'btnHandler'イベントは常にnullです。したがって、それは親イベントを呼び出さない。EventHandlerがnullです

これに関するお手伝いをさせていただきます。

マイユーザーコントロールのコードは次のとおりです。

た.ascxコード:

<asp:ImageButton ImageUrl="./images/step1.gif" 
     ID="imgstep1" runat="server" 
     OnClick="imgstep1_Click"/> 

.ascx.csコード:

public delegate void OnImageButtonClick(); 
    public event OnImageButtonClick btnHandler; 

    protected void imgstep1_Click(object sender, ImageClickEventArgs e) 
    { 
     if (btnHandler != null) 
      btnHandler(); 
    } 

.aspxページのコード:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ucStepHdr.btnHandler += new StepsHeader.OnImageButtonClick(ucStepHdr_btnHandler); 
} 

void ucStepHdr_btnHandler() 
{ 
    Response.Write ('test'); 
} 
+0

これはコード全体であるか、典型的な「リロード」タイプのブロック内に「+ = new ...」という行がありますか? –

答えて

10

コードは正しく動作するように見えます。 btnHandlerがnullである唯一の理由は、aspxページのイベント登録コードが呼び出されないためです。

ポストバックはありますか?ページが読み込まれるたびにイベントを追加してもよろしいですか?

ucStepHdr.btnHandler += new StepsHeader.OnImageButtonClick(ucStepHdr_btnHandler); 
+0

はい!それが問題でした。私はそれをwitin(!IsPostBack)コードと呼んでいた。コードを外に置くと、コードが動作し始めました。 あなたのすべての答えをおねえてくれてありがとう。 – jack

0

それはうまくいくはずだ...デバッガのコードをステップ実行し、Page_Loadに設定するとすぐにucStepHdr.btnHandlerの値を確認します。 (ちょうど脇に、伝統的にこれらはロードではなくinitに設定されていますが、これはあなたの問題ではありません)

1

あなたがOnClick="imgstep1_Click"を削除し、あなたのascx.cs

protected ImageButton imgstep1; 

protected override void OnInit(EventArgs e) 
{ 
    this.imgstep1.Click += new ImageClickEventHandler(imgstep1_Click); 
} 

でこれを入れた場合はい、あなたのイベントの仕事を配線するこの方法?