- PR -

GridViewのTemplateFileのButtonコントロールのイベントについて

1
投稿者投稿内容
まさお
常連さん
会議室デビュー日: 2007/11/06
投稿数: 38
投稿日時: 2008-09-12 00:28
お世話になります。

[VS2005]
GridViewのTemplateFileにてButtonコントロールを配置したのですが、
GridViewのRowCommandイベントが発生しません。

[aspxソース]
<asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False">
〜(略)〜
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="btnHistory" runat="server" CommandName="History"
      Text="履歴"/>
</ItemTemplate>
</asp:TemplateField>
〜(略)〜
</asp:GridView>

ちなみにこのボタン押下で子画面を開くようにしています。
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
'履歴ボタンを押したら、子画面で注文履歴を表示
Dim sb As New StringBuilder
sb.Append("ret = window.showModalDialog('子画面','', 'dialogWidth:600px;dialogHeight:600px;');")
sb.Append("return false;")

If e.Row.RowType = DataControlRowType.DataRow Then
CType(e.Row.FindControl("btnHistory"), Button).Attributes("onclick") = sb.ToString
End If
End Sub

やりたいことは、GridView中のボタンを押して、
その列の値(ID)をセッション変数に格納し、
子画面を表示するということです。

子画面は表示されるのですが、RowCommandイベントが発生しない為、
セッション変数にその列の値を入れることができません。

どなたか解る方がいらっしゃいましたら、ご教授ください。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-09-12 00:54
提示されているコードだと、ボタンを押された時の動作は以下の様になっています。
1) showModalDialogで子画面を出す
2) showModalDialogが閉じられたら、falseを返してsubmitをキャンセルする

ですのでこのコードの状態では、
・PostBackしなければならないのに、PostBackをキャンセルしてしまっている
・PostBack後にshowModalDialogしなければならないのに、順番が逆
という、大まかに二つの問題が含まれた状態になっているように思えます。


対応方法としてはいくつかあると思いますが、とりあえず以下の方法ではどうでしょうか。

・RowDataBound時にボタンにJavascriptを登録しない
 (=そのままPostBackさせてるようにする)
・RowCommandにて、必要な処理(セッションへの格納等)を実行
・上記処理実行後、イベントハンドラを抜ける前にClientScript.RegisterClientScriptBlock(もしくは類似のScript登録メソッド)でshowModalDialogを実行するスクリプトを書きす


<編集:誤字を修正>

[ メッセージ編集済み 編集者: kiyokura 編集日時 2008-09-12 00:55 ]
まさお
常連さん
会議室デビュー日: 2007/11/06
投稿数: 38
投稿日時: 2008-09-12 10:14
返答ありがとうございます。とても勉強になりました。

ところが、↓ここまでは上手くいったのですが、
>・RowDataBound時にボタンにJavascriptを登録しない
> (=そのままPostBackさせてるようにする)
>・RowCommandにて、必要な処理(セッションへの格納等)を実行


>・上記処理実行後、イベントハンドラを抜ける前に>ClientScript.RegisterClientScriptBlock(もしくは類似のScript登録メソッド)で>showModalDialogを実行するスクリプトを書きす

↑ここがうまくいかず、子画面が開きません

[ソース]
Dim sb As New StringBuilder
sb.Append("ret = window.showModalDialog(子画面','', 'dialogWidth:600px;dialogHeight:600px;'); ")
sb.Append("return false; ")
ClientScript.RegisterClientScriptBlock(Me.GetType(), "PopUp", sb.ToString)

RegisterStartupScriptでもやってみたのですが、変わりません。

うーーーん。。。
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-09-12 11:17
ポップアップブロックが作動しているとかいうことはありませんか?

そうでないのなら、ポストバックで返ってきたHTMLソースを開いてみて、
スクリプトが正しく登録されているかどうかを確認してみてください。

スクリプト文字列がそのままブラウザに表示されてしまっているなんてことはありませんか?
_________________
//---
 あやのこうじ@RapidExpress
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-09-12 11:36
引用:

まさおさんの書き込み (2008-09-12 10:14) より:
>・上記処理実行後、イベントハンドラを抜ける前に>ClientScript.RegisterClientScriptBlock(もしくは類似のScript登録メソッド)で>showModalDialogを実行するスクリプトを書きす

↑ここがうまくいかず、子画面が開きません




ボタン押下してPostBack完了後に表示される画面でHTMLソースを見てみると、RegisterClientScriptBlockで登録した文字列がどこかに書き出されているのハズなので、それを見てみれば動かない原因はわりとすぐ分かるかと思います。

対処方法ですが、RegisterClientScriptBlockの引数を4つとるオーバーロードの第4引数の意味と、引数3つのオーバーロードの時にその値がどう扱われるかについて確認されると、解決すると思います。
http://msdn.microsoft.com/ja-jp/library/btf44dc9(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/bahh2fef(VS.80).aspx

#あと、開かない件と直接は関係ないですが、showModalDialogの後に書いている『return false;』についても、要不要を再確認したほうが良いのではと思います。
まさお
常連さん
会議室デビュー日: 2007/11/06
投稿数: 38
投稿日時: 2008-09-12 12:47
返答ありがとうございます!

無事解決しました!!

いうのが遅れて申し訳ないのですが、AJAXを利用していました。

その為、ClientScriptでスクリプトを登録しようとしても、
UpdatePanelの中の部分しか書き換えられない為、
Pageにスクリプトを登録できませんでした。
(その為、ソースを見ても見当たりませんでした。)

なので、AjaxのScriptMangerのRegisterStartupScriptを利用したところ
上手くいきました。

また一つ勉強になりました。
kiyokura様、RapidExpress様本当にありがとうございました。
1

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