- PR -

GridViewに配置したボタンにより別ウィンドウを開く(ASP,C#)

投稿者投稿内容
Gottu
会議室デビュー日: 2006/02/19
投稿数: 12
投稿日時: 2006-02-22 14:26
Access様、どうもありがとうございます。
昨日から試行錯誤して"SelectedIndexChanded"イベントで、選択した行情報を取得する事ができました。
その値をとりあえずTextBoxに貼り付け、ご指摘の通り"DataBound"イベントで新しいウィンドウを開こうと思いましたが、なぜか"DataBound"イベント時にTextBoxの値が""になってしまいうまく行きません。。。
(Access様のご指摘の通りにやっているか不安ですが。。)

ボタンを押した後のイベントハンドラの発生順を追ってみたところ、
"Page_Road" ⇒ "Button_Click" ⇒ "SelectedIndexChanged" ⇒ "Page_Road" ⇒ "DataBound"の順になっています。
この2回目の"PageRoad"でTextBoxの値が消滅しているようです。

また、"SelectedIndexChanged"イベント内にコードを記述した場合は2回目のクリックで"xxx.aspx"が立ち上がり、"Page_Road"イベント内にコードを記述した場合は3回目のクリックで"xxx.aspx"が立ち上がります。

ゴールに近づいているような気はするのですが。。。
ちなみにコードは下記のように記述しています。

if (TextBox1.Text != "")
{
Button bt;
bt = (Button)GridView1.Rows[int.Parse(TextBox1.Text)].Cells[0].FindControl("Button");
bt.OnClientClick = "window.open('XXX.aspx')";
}

※"SelectedIndexChanged"に記述する場合は先頭のif文は削除します
Gottu
会議室デビュー日: 2006/02/19
投稿数: 12
投稿日時: 2006-02-23 20:35
ACCESS様。
いつもお世話になっております。

つい先ほどですが、何とか解決しました!
いろいろとアドバイスありがとうござました。
お陰様でようやく先に進めそうです。

ちなみに私が見つけたやり方は下記の通りです。
あまり美しくないかもしれませんが。。

protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridView1.Rows[i].Cells[0].Attributes["OnClick"] = "window.open('PDF.aspx')";
}
}

<中略>

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "button1")
{
int index = Convert.ToInt32(e.CommandArgument);
GridView1.Rows[index].Cells[0].Attributes["OnClick"] = "window.open('PDF.aspx')";
}
}

スキルアップ/キャリアアップ(JOB@IT)