- PR -

[ASP.NET]showModalDialogで親画面のボタンを操作する

投稿者投稿内容
紫泉
会議室デビュー日: 2005/03/18
投稿数: 5
お住まい・勤務地: 石川県
投稿日時: 2005-03-18 15:58
初めて投稿いたします。よろしくお願いいたします。

親画面(Main.aspx)に一覧データを表示し、
一覧で選択したデータを子画面(Sub.aspx)に表示し、
子画面で選択データの更新を行って親画面に戻る、という動作を実現しようとしています。

子画面はshowModalDialogでHTML(Sub.htm)を表示し、
HTML(Sub.htm)のframesetで子画面のSub.aspxを指定して、
子画面でのPostBack時に複数ウィンドウが立ち上がるのを防いでいます。

子画面でデータの更新ボタンをクリック後、親画面の再検索ボタンをクリックして、
子画面を閉じるJavaScriptを以下のように記述しました。

Dim strScript As New System.Text.StringBuilder
strScript.Append("<script language=javascript>")
strScript.Append("window.opener.Form1.Btn_ReSearch.click();")
strScript.Append("self.window.close();")
strScript.Append("</script>")
Page.RegisterStartupScript("closewindow", strScript.ToString)

これを実行すると、
window.opener.Form1はNullまたはオブジェクトではありません。
という、エラーになってしまいます。

open.windowでの親画面のボタン操作については過去ログの
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13254&forum=7
にありましたが、showModalDialogと何か手法が異なるのでしょうか?

親画面の再検索を行うよい方法がありましたら、
ご教授くださいませんか?

_________________
はぎ丸
常連さん
会議室デビュー日: 2005/02/02
投稿数: 36
投稿日時: 2005-03-18 16:18
こんにちは。
引用:

これを実行すると、
window.opener.Form1はNullまたはオブジェクトではありません。
という、エラーになってしまいます。



親画面のHTMLソースの中にForm1は存在しますか?
また、そのForm1タグ内にBtn_ReSearchは存在していますか?

もしかしたら、たくさんサーバーアクセスするボタンがあるのかもしれないですね。
その場合にはFormの名前がForm1,Form2とかなるんじゃないですかね?

的外れの答えだったらごめんなさい。。。
紫泉
会議室デビュー日: 2005/03/18
投稿数: 5
お住まい・勤務地: 石川県
投稿日時: 2005-03-18 16:25
ご返答ありがとうございます。

>親画面のHTMLソースの中にForm1は存在しますか?

<form id="Form1" method="post" runat="server">
となっています。

>また、そのForm1タグ内にBtn_ReSearchは存在していますか?

はい。
<asp:button id="Btn_ReSearch" runat="server" Text="再検索"></asp:button>
となっております。
_________________
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-18 16:51
showModalDialogで開いたウィンドウはちょっと特殊で、window.openで開いた子画面とは全然違ったはずです。「ダイアログ」であって「子画面」ではないですから。
なので、showModalDialogで開いたHTMLから、window.openで開いたHTMLと同じような処理を行おうとしても無理だったはず。その代わり、window.openでは使えないwindow.returnValueという属性が使えます。これは、読んで字の如く親画面に好きな戻り値を返せます。
なので、これを使って処理ごとに違う戻り値を親画面に返して、処理自体は全部親画面側で行わないといけないと思います。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-03-18 16:54
showModalDialogで開いたウインドウが開いている間、呼び元は、そのウィンドウが閉じられるのを待っています。
待っている間は、開いているウィンドウが呼び元に対して何かする事はできません。
ぼのぼのさんが仰っている方法に切り替えるのがベターかと思います。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
紫泉
会議室デビュー日: 2005/03/18
投稿数: 5
お住まい・勤務地: 石川県
投稿日時: 2005-03-18 16:56
ぼのぼの様、NAL-6295様、ご返答ありがとうございます。

>window.returnValueという属性が使えます。これは、読んで字の如く親画面に好きな戻り値を返せます。
>これを使って処理ごとに違う戻り値を親画面に返して、処理自体は全部親画面側で行わないといけないと思います。

そうだったんですか。
window.returnValueについて調べてみます。
ヒントをありがとうございました。

[ メッセージ編集済み 編集者: 紫泉 編集日時 2005-03-18 16:58 ]
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-03-18 16:58
showModalDialogではopenerが使えないみたいですね。
引数と戻り値のあるのwindowとして使うといいらしいです。

showModalDialogとopenerで検索したらいろいろと出てましたよ。

http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/dialogarguments.asp
Show Exampleをクリックするとサンプルが表示されます。

_________________
たつごろー
codeseek
こみゅぷらす
紫泉
会議室デビュー日: 2005/03/18
投稿数: 5
お住まい・勤務地: 石川県
投稿日時: 2005-03-19 13:21
親画面のソースを以下のように変更しました。

--------------------------------------------------------------------------
Dim strScript As New System.Text.StringBuilder
strScript.Append("<script language=javascript>")
strScript.Append("var rtn;")
strScript.AppendFormat("rtn = showModalDialog('Sub.htm',''," _
& "'dialogWidth=400px;dialogHeight=180px;scrollbars=yes;center=yes;border=thin;help=no;status=no');")
strScript.Append("if ( rtn == 'True' ) { document.all.Btn_ReSearch.click(); }")
strScript.Append("</script>")

Page.RegisterStartupScript("openwindow", strScript.ToString)
--------------------------------------------------------------------------

子画面では、値を返すように以下のように変更しました。
--------------------------------------------------------------------------
Dim strScript As New System.Text.StringBuilder
strScript.Append("<script language=javascript>")
strScript.Append("window.returnValue = 'True';")
strScript.Append("self.window.close();")
strScript.Append("</script>")

Page.RegisterStartupScript("closewindow", strScript.ToString)
--------------------------------------------------------------------------

動作的には仕様を満たしているのですが、親画面でJavaScriptのエラーが
発生しています。
strScript.Append("if ( rtn == 'True' ) { document.all.Btn_ReSearch.click(); }")
のdocument.all.Btn_ReSearch.click();という部分を削除すると
エラーは消えるので、発生位置は特定できたのですが原因がわかりません。
Btn_ReSearchのイベントも発生しています。
Btn_ReSearchのイベントがすぐにPostBackされるのでエラーは消えてしまうのですが、
気になります。

間違いをご指摘いただけませんでしょうか?

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