- PR -

子ウィンドウから親ウィンドウのイベントを起こしたい

1
投稿者投稿内容
pika
会議室デビュー日: 2003/03/11
投稿数: 7
投稿日時: 2003-03-14 16:31
VB.NETでWEBフォームを作成しています。

親ウィンドウから呼び出した子ウィンドウでデータを更新し、
子ウィンドウを閉じたときに親ウィンドウでdatagridを再表示したい。
どのようにすればよいでしょうか?
また、下記の方法では不可能でしょうか?
ご存知の方、よろしくお願いします。

現在、親画面の子画面呼び出し時に下記コードを記述しています。
<親ウィンドウのコマンドボタンクリック時>
strscript &= "<script language=javascript>"
strscript &= "var features = 'Height=280,Width=340,Top=1,Left=650,"
strscript &= "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no';"
strscript &= "window.open('A.aspx ','TARGET',features);"
strscript &= "</script>"
Response.Write(strscript)


mito
ベテラン
会議室デビュー日: 2002/05/17
投稿数: 50
投稿日時: 2003-03-17 15:29
VB.NETは良くわかりませんが、クライアント側の閉じるボタンのクリックイベントで以下の処理をすれば良いと思います。

<SCRIPT LANGUAGE=JAVASCRIPT>
function ChildClose() {
if ( ! opener.closed) {
opener.location.href = "P.aspx"
self.close()
}
}
</SCRIPT>

今回の場合、更新するだけなのでopener.location.href = "P.aspx"はopener.location.reload()でも良いかもしれません。
注意する点は親がフレームの場合、親フレーム全体が更新されるとopenerオブジェクトの参照先が消えてしまうことがあります。親フレーム全体が更新され可能性がある場合、JAVASCRIPTにエラー処理を組み込む方が確実です。
pika
会議室デビュー日: 2003/03/11
投稿数: 7
投稿日時: 2003-03-17 17:18
mitoさんご返答ありがとうございます。

早速、やってみたのですが、
子画面で登録ボタンクリック時に
下記の順序でイベントが発生してしまい、
データグリッドの再表示ができません。

@親画面 page_load イベント
      ↓
 子画面 btnA_ServerClick イベント

Aデータグリッドを再表示するかどうかは、親画面にセッション情報を引き渡しています。
 子画面 ボタンクリック時 Session("HENKO_FLG") = True
      ↓
 親画面 page_load時  Session("HENKO_FLG") = True の場合、
              datagridを再表示する。

やり方がまずいのでしょうか?
mito
ベテラン
会議室デビュー日: 2002/05/17
投稿数: 50
投稿日時: 2003-03-18 10:11
一般的にクライアント側の処理はサーバ側の処理よりも先に処理されます。
子画面で登録ボタンにクライアント側処理とサーバ側処理が共に指定されていれば、クライアント処理→サーバ処理という順で処理されます。これはクライアント側でエラーチェックなどをした後サーバ側で処理(登録など)するのには都合通いのですが、今回のように登録後に親画面を更新する場合には利用できません。
いちばん簡単な方法は別のボタンを作ってユーザに都合の良い時点で更新してもらう方法です。
他には登録成功後、サーバ側でJavascriptの変数を設定し、その変数にしたがってクライアント側ロードイベントで親画面の更新を行うようにするとかです。
<SCRIPT LANGUAGE=JAVASCRIPT>
var HENKO_FLG = <% =Session("HENKO_FLG") %> // ASP.NETで変更したい場合TRUEに設定
function PageLoad() {
if ( HENKO_FLG && ! opener.closed) {
opener.location.href = "P.aspx"
}
}
</SCRIPT>
<BODY onLoad="PageLoad()">
</BODY>
pika
会議室デビュー日: 2003/03/11
投稿数: 7
投稿日時: 2003-03-24 08:43
返答が遅れましてすみませんでした。

mitoさんの方法で試してみたところ、親画面のページロードイベントを
発生させることはできたのですが、子画面から渡したsessionの値が
親画面で受け取るところでうまくいきませんでした。
今回は、他の画面との統一性を図るため、1画面で作成することになりました。
今後ともよろしくお願いします。

mitoさんには、いろいろと親切にご教授いただきありがとうございました。
1

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