2009-03-29 55 views
3

ユーザーが別のLinkBut​​tonをクリックしたときにLinkBut​​tonを動的に読み込みます。私はそれにイベントハンドラを添付しています。ユーザーが動的に読み込まれたLinkBut​​tonをクリックすると、イベントは発生しません。動的に読み込まれたコントロール - Page_Initの値にアクセスする方法

私が読んでいるところでは、これは、ページが動的に読み込まれたコントロールがもう存在しなくなったためです。このコントロールがPage_Initで再作成されていることを確認する必要があります。

動的に作成されるLinkBut​​tonは、値(製品ID)に依存します。この値にアクセスするには、私は適切にコントロールを作成できるようにする必要があります。 ViewStateにアクセスできず、セッションを使用するとタイムアウトになる可能性があり、それが役に立たないことが懸念されます。何か案は?

また、テストのためにプロダクトID値をハードコードしましたが、それでもイベントが発生しませんでした。私は何か他に何かする必要がありますか?

protected void Page_Init(object sender, EventArgs e) 
{ 
    SetTabText(1, 1); 
} 

SetTabTextがLinkBut​​tonコントロールを作成しますSetActionLinks呼び出す:私はあなたのコードを試してみました、あなたのシナリオでは

protected Panel SetActionLinks(int prodID, int tabID) { 
... 
LinkButton lnkBtn = new LinkButton(); 
lnkBtn.ID = "lnkBtn" + rand.Next().ToString(); 
lnkBtn.CommandName = "action"; 
lnkBtn.Command += new CommandEventHandler(this.lnkAction_Command); 
panel.Controls.Add(lnkBtn); 
... 
} 
void lnkAction_Command(object sender, CommandEventArgs e) 
{ 
    LinkButton btn = (LinkButton)sender; 
    switch (btn.CommandArgument) 
    { 
     AddCart(); 
    } 
} 

答えて

0

匿名の代表者を見

LinkButton lb = new LinkButton(); 
lb.Command += delegate { // do something here. also you can access any variable from current stack }; 
+0

私のイベントを匿名の代理人に変更しましたが、何も変更されていないようです... –

2

を、以下の行は、障害を発射あなたのイベントが発生します。

lnkBtn.ID = "lnkBtn" + rand.Next().ToString(); 

ポストバック間で変更されないIDを設定しようとしました。

ViewStateでは、コードをPage_Loadに移動できます。あなたのコードは同じ動作をしますが、ViewStateのにアクセスすることができますし、あなたのコントロールのは、あなたが必要としないこの道を隠しフィールドにプロダクトIDを入れて、

Page.Request(Page.FindControl("hdnPageIdField")) 

を使用してPage_Initでその値を取得することができる値

+0

IDはそのまま表示する必要があります。名前の変更は一貫しているように変更しましたが、うまくいきました。 –

5

を掲載しましたダイナミックコントロールのためにも

ViewStateのかのSessionStateに頼らざるを私は非常にあなたが this greate arcticle series

+0

+1偉大な読書Ender、そのリンクのおかげで、それは私が探していたものです... –

0

を読むことをお勧めあなたの.aspxのファイルであなたAutoEventWireup="true"がありますか?

1

私は数ヶ月前にこのような何かを考えて、眠れない夜を過ごしました。それは、ASP.NETがステートレスな基盤上に構築され、クライアントとサーバーの間でビューステートをping-pongingすることによって状態を維持するという事実を完全に突き詰めたときです。

ダイナミックに作成されたコントロールのイベント発生に対して、コントロールを動的に追加または削除したり、既存のコントロールを変更する場合、親要素のPageInitは、イベント発生時に存在していた状態の子コントロールを再作成する必要がありますイベントのアクションが適用される前に)。冗長に見えるかもしれませんが、受信機が存在し、サーバがイベントを発生させたいときにハンドラを呼び出すことができるようにする必要があります。その後、コントロールのイベントハンドラが変更を適用できるようになります(コントロールの追加や削除、別のIDの割り当てなど)

このページはASP.NETイベントライフサイクル(http://msdn.microsoft.com/en-us/library/ms178472.aspx)に役立ちました。

1

これはPage_Init

HiddenField ctrl = (HiddenField)Page.FindControl("hfTest"); 
string strValue = Page.Request.Form.Get(ctrl.ClientID); 

に働くのHiddenFieldは(パイプ区切り)ロードするコントロールを格納します、我々はコントロールを動的にロードすることができます。

関連する問題