2016-07-13 20 views
0

ページのinitまたはoninitにコードを入れずに動的に生成した4つのボタンにクリックイベントハンドラを使用する方法を解明しようとしています。私は1回ボタンをクリックすると、さらに4つのボタンが生成されます。これら4つのボタンのクリックイベントハンドラは機能しません。ここにコードがあります。誰もが最初にpage_loadに入れずにasp.netのC#でクリックイベントを使用する方法を考え出しましたか?私はこの問題を解決することができれば、私は大きなシナリオでは、私の本当の問題を解決することができます。:ページのinitまたはpageのロードを使用せずに動的ボタンのクリックイベントハンドラを使用する方法

protected void Page_Load(object sender, EventArgs e) 
{ 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += new EventHandler(b_click); 

     PlaceHolder1.Controls.Add(b); 
    } 
} 

void b_click(object sender,EventArgs e) 
{ 
    Label1.Text = "ok"; 
} 
+3

イベントハンドラが動作しない理由は、コントロールツリーがポストバック時に正しく再作成されないためです。ビューステートをロードしてイベントを発生させる前に、ボタンを再作成するためにオーバーライドする必要がある特別なページイベントがあります。 –

+1

ボタンの数は静的ですか?ボタンが4つしかないことがわかっている場合は、ボタンが必要になるまで表示しないようにしてください。このようにして、あなたのイベントワイヤーアップは余分な介入なしに期待どおりに動作するはずです。 – dstepan

+0

@MattiasÅslundはい、それはinitメソッドです。明らかにOPは彼が何をする必要があるかを正確に知っていますが、彼は具体的には彼がそれをしたくないと言っています。 – Servy

答えて

0

をあなたのダイナミックコントロールのIDが明確なキーワードが含まれていることを確認します。下の私の例では、自分のIDに「DYNAMIC_」を追加しました。そして、このようなOnPreRender()を上書き:

もちろん
protected override void OnPreRender(EventArgs e) 
{ 
    if (Page.IsPostBack && !IsPostBackEventControlRegistered) 
    { 
     var controlName = this.Request.Form.AllKeys.SingleOrDefault(key => key.Contains("DYNAMIC_")); 
     processEventForDynamicControl(controlName); 
    } 

    base.OnPreRender(e); 
} 

private void processEventForDynamicControl(string controlName) 
{ 
    //Do your dynamic button click processing here 
} 

、あなたの動的なコントロールが使用している場合(悲しげにボタンがありません)あなたはこのよう__EVENTTARGETから直接制御を取得することができdoPost()

var controlName = Request.Params.Get("__EVENTTARGET") 
0

あなたが欲しいですコントロールを内部にロードするPage_Load。それ以外の場合は、コントロールツリーにはなく、b_clickイベントをトリガーできません。

public int Counter 
{ 
    get { return (int?) ViewState["Counter"] ?? 0; } 
    set { ViewState["Counter"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    var counter = Counter; 
    for (int i = 0; i < counter; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += b_click; 
     PlaceHolder1.Controls.Add(b); 
    } 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Counter = 4; 
    for (int i = 0; i < 4; i++) 
    { 
     Button b = new Button(); 
     b.ID = i.ToString(); 
     b.Text = "ClickMe"; 
     b.Visible = true; 
     b.Click += b_click; 

     PlaceHolder1.Controls.Add(b); 
    } 
} 
void b_click(object sender, EventArgs e) 
{ 
    Label1.Text = "ok"; 
} 

注:あなたはPage_Init内にロードすることを計画している場合、あなたが代わりにViewStateのセッションを使用したいです。

+0

私はこのアプローチに行きます。セッションに慣れていない場合は、非表示フィールドを使用することができます – user3532232

+0

***非表示フィールド***は、このシナリオでは*** ViewState ***と基本的に同じです。隠しフィールドを使用する場合は、*** Page_Load ***を使用する必要があります。その値は*** Page_Init ***イベント内で使用できないためです。 – Win

0

基本的に私はそれを働かせました。周りには道はありません。 OninitまたはPage_loadを使用し、PlaceHolder1.Controls.Add(b)に加えて、b.Click + =新しいEventHandler(b_click)コードをそこに置く必要があります。イベントハンドラがボタンに正しく登録されるようにします。このメソッドの問題は、WebページのPlaceHolder部分の上にボタンを配置することです。これは、私が望むものではありません。私は、ウェブページの特定の位置にボタンを置くことができるようにしたい。では、どうやってこれをやっていくのですか?基本的にはPlaceHolder1.Controls.Add(b)の後にボタンを隠すだけです。次に、htmlの特定の部分にボタンを配置する準備ができたら、PlaceHolder1.Controls.Add(b)をもう一度呼び出して見えるようにします。それは私のために働く。誰かがこれに助けが必要な場合は、サンプルコードを投稿して、自分でテストすることができます。皆さんありがとう。

+0

これは私が[私の答え](http://stackoverflow.com/a/38360247/296861)で言ったことではありませんか?ポジショニングはあなたの営業の範囲から完全に外れています。 – Win

関連する問題