DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Webユーザーコントロールについて

環境/言語:[環境(WindowsXP)、使用言語(C#)、.NET Framework2.0]
分類:[ASP.NET]

はじめまして。ふぉれすこむと申します。
Webユーザーコントロールについて質問があります。
分かる方がみえましたら、教えてください。
よろしくお願いします。

【わからないこと】
Webユーザーコントロールで、以下のコードを定義して、
メイン画面で、Webユーザーコントロール部分のボタンを押しても、
WebUserControl_Click部分のコードを認識していません。
現在のところ、何が原因か把握できていません。

【コード】

protected void Page_Load(object sender, EventArgs e){
int i = 1;
int tpos = 0;

this.Buttons = new System.Web.UI.WebControls.Button[20];

while (dr.Read()){

if (i < 20){
this.Buttons[i]=new System.Web.UI.WebControls.Button();
this.Buttons[i].ID = "Button" + dr[0].ToString();
this.Buttons[i].Width = 149;
this.Buttons[i].Height = 24;
tpos = 150 + i * 25;
this.Buttons[i].Style["Top"] = tpos.ToString()+"px";
this.Buttons[i].Style["Left"] = "25px";

this.Buttons[i].Text = dr[1].ToString();
this.Buttons[i].Click += new EventHandler(WebUserControl_Click);
this.Controls.Add(this.Buttons[i]);
}
i = i + 1;
}
}
}

void WebUserControl_Click(object sender, EventArgs e){
int ret;
ret = int.Parse(((System.Web.UI.WebControls.Button)sender).ID);
switch (ret){
case 1:
Server.Transfer(A.aspx);
break;
case 2:
Server.Transfer(B.aspx);
break;
}
}
> ふぉれすこむ さん

上記コードはそのままだとコンパイルが通らないですが、やりたいこととしては、
・Page_Loadで(あるいはその前に)どこかからデータを取得してくる
・ボタンを20個動的に追加、その時にイベントを設定
・押したボタンによって、表示先を切り替える
という内容でよろしいでしょうか?

ASP.NETでは、どのコントロールがイベントを発生させたかを認識するために Control.ID を使用します。なので、

> this.Buttons[i].ID = "Button" + dr[0].ToString();

のDataReaderから取得できる値がページの表示時とポストバック時で異なる場合は、イベントを認識しません。
例えば上記の場合、

this.Buttons[i].ID = "Button" + i;

などではiは常に同じ範囲で同じIDのボタンができるため、イベントを認識しますが、

this.Buttons[i].ID = "Button" + DateTime.Now.Ticks;

ではIDが常に異なるため、イベントは一切発生しなくなります。

# 蛇足ですが、Clickなどの動作イベントはLoad内でコントロールを動的に構築してもイベントを認識しますが、
# TextChangedなどのプロパティ変更イベントはLoad以前にコントロールツリーが構築できていないと
# イベントを認識しなかったと記憶しています。

上記のようなかんじで参考になりましたでしょうか?
■No24819に返信(tunamiさんの記事)

tunamiさん、ご教示ありがとうございます。
舌足らずですいません。以下のような感じで処理を進めています。

> ・Page_Loadで(あるいはその前に)どこかからデータを取得してくる
> ・ボタンを20個動的に追加、その時にイベントを設定
> ・押したボタンによって、表示先を切り替える
> という内容でよろしいでしょうか?

指摘して頂いた部分を読んで、Control.ID を使用して、イベントを
認識できるタイミングを探すことだと思いましたので、早速、試させて
頂き、また報告させていただきます。ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板