- PR -

子ウィンドゥが閉じないのです。

投稿者投稿内容
さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2006-05-18 22:00
こんばんは。
ASP.NET2.0(IE6)

子ウィンドゥのドロップダウンリストから値を選択し、
OKボタンを押すと、その子ウィンドゥを閉じ、
親ウィンドゥのラベルに、その値を表示させようとしているのですが、
値も入らず、子ウィンドゥも閉じません。
子ウィンドゥのOKボタンを押した時のコードは、

Dim strID As String = ddlName.SelectedValue.ToString
Dim strScript As New StringBuilder
 With strScript
 .Append("<script language='javascript'>" & vbCrLf)
.Append(vbTab & "window.opener.test.lblID.value='" & strID & "';" & vbCrLf)
.Append(vbTab & "window.close();" & vbCrLf)
.Append("</" & "script>")
End With
ClientScript.RegisterClientScriptBlock(Me.GetType, "closewin", strScript.ToString)
です。

子ウィンドゥを開く時のコードは、
Dim objScript As New StringBuilder
Dim strFeatures As String = "height=150,width=430,left=50,top=50," & _
 "location=no,menubar=no,resizable=yes,scrollbars=no," & _
"status=no,titlebar=yes,toolbar=no"
With objScript
 .Append("<script language='javascript'>" & vbCrLf)
 .Append(vbTab & "window.open('child.aspx',null,'" & strFeatures & "');" & vbCrLf)
 .Append("</" & "script>")
End With
ClientScript.RegisterClientScriptBlock(Me.GetType, "openwin", objScript.ToString)
で、子ウィンドゥを開く方は、問題なく動作します。

どこがいけないのでしょうか。
よろしくお願いします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-05-18 23:16
これ、開くときってほんとに動いてます?
もしかしてPostBackしてページが切り替わったあと動いてるんでしょうか。
だとすると、ブラウザのポップアップブロックが効いてたりすると警告が表示されませんか?

こういった場合、JavaScriptは関数化しておいて、ボタンクリック時に
その関数を呼ぶような形にするのが普通だと思うのですが、
これだと単にJavaScriptをページ内に追加してるだけですよね。。。
まぁ、子ウィンドウのほうもボタンを押したときにPostBackさせてやれば
一応動くだけは動くかもしれないけど。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-19 00:54
まずは静的なHTMLで試してみませんか?

とりあえず次のHTMLは動くみたい


コード:
<html>
<head>
<title>親</title>
</head>
<body>
  <script type="text/javascript" >
    function openChild() {
      window.open("子供.html");
    }
  </script>
  <input id="cmdOpen"  type="button" onclick="openChild()" value="子供を開く" />
  <input id="txtValue" type="text" />
</body>
</html>




コード:
<html>
<head>
<title>子</title>
</head>
<body>
  <script type="text/javascript" >
       window.opener.document.getElementById("txtValue").value = "hoge";
       window.close();
  </script>
</body>
</html>

うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-19 01:36
コード:
.Append(vbTab & "window.opener.test.lblID.value='" & strID & "';" & vbCrLf) 


Labelは変更できないのではないでしょうか?
TextBox等であれば問題なく動くと思います。
たぶん、Labelの文字列は要素ではないので変更できないのでしょう。



あと、本題とは関係ないですがスクリプトはファイルを別にした方がメンテナンスし易いですよ。
たとえば、sample.jsというファイルを作成し、
sample.js
コード:
function openwin(aspx, features)
{
    window.open(aspx, null, features);
}

function closewin(id)
{
    window.opener.test.lblID.value = id;
    window.close();
}


各aspx.vb
コード:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ClientScript.RegisterClientScriptInclude("sample", "sample.js")
    Button1.Attributes("onclick") = "openwin('child.aspx', 'status=1,menubar=1')"
    //クローズなら
    //Button1.Attributes("onclick") = "closewin('test')"
End Sub


のように記述すれば、期待する動きになると思います。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-19 01:43
引用:

うにくまさんの書き込み (2006-05-19 01:36) より:
コード:
.Append(vbTab & "window.opener.test.lblID.value='" & strID & "';" & vbCrLf) 


Labelは変更できないのではないでしょうか?



あっラベルなのか…
としたら innerHTML でいけるかな
コード:
       //window.opener.document.getElementById("txtValue").value = "hoge";
       window.opener.document.getElementById("txtValue").innerHTML = "hoge";

さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2006-05-19 14:34
こんにちは。
ありがとうござます。
ラベルをテキストボックス(txtId)にしたら、値の取得はできるようになったのですが、
その後で、別の問題が出てきてしまいました。
ASP.NET2.0以前の書籍を参考にしているのですが、
ASP.NET2.0ではエラーになってしまうようで。

親画面に値が入った後、値が入ったテキストボックスのTextChangeイベントを使って、
その値を元に、DBからレコードを取得、表示しようとしています。

<asp:Button ID="btnRefresh" runat="server" Text="hidden" Visible="false" />
でhiddenボタンを貼り付けておき、
PageのLoadイベントで、
txtId.Attributes.Add("OnPropertyChange", ClientScript.GetPostBackEventReference(btnRefresh, ""))
のように、txtIdの値が変更されたら、
btnRefreshボタンのOnClickイベントが実行されるようにしています。
そのOnClickイベントで、取得した値をもとにしたレコードの表示を行うようにしています。
ところが、実行すると、txtIdに値が入ったあと、以下のようなエラーメッセージが表示されてしまいます。

無効なポストバックまたはコールバック引数です。イベントの検証は、構成の <pages enableEventValidation="true"/>、またはページの <%@ Page EnableEventValidation="true" %> を使用して有効にされます。セキュリティの目的により、この機能は、イベントをポストバックまたはコールバックする引数が、それらを最初に表示したサーバー コントロールから発行されていることを確認します。データが有効であり、予期されている場合、検証のためのポストバックまたはコールバック データを登録するために ClientScriptManager.RegisterForEventValidation メソッドを使用してください。


どうしたらよいのやら。
よろしくお願いします。


さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2006-05-19 14:51
つづきです。

<%@ Page EnableEventValidation="true" %>

<%@ Page EnableEventValidation="false" %>
にすると、エラーメッセージは表示されず、
実行されるようになるのですが、
やっぱり、よくないですよね。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-19 23:46
たぶん、現在はbtnRefresh_Clickに処理を記述していると思いますが、
それをtxtID_TextChangedへ移動して、次に以下の太字の部分をtxtIDに変更してください。
コード:
txtId.Attributes.Add("OnPropertyChange",
            ClientScript.GetPostBackEventReference(btnRefresh, ""))


これで正しく実行されると思います。(btnRefreshは不要です)


あと、txtID_TextChangedの最後に次の一文を追加すると、子ウィンドウから戻った場合のみに更新されるようになります。
コード:
txtID.Attributes.Remove("OnPropertyChange")

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