- PR -

子画面から親画面のテキストボックスに値を入れたい

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2008-06-17 16:00
引用:

ぷりさんの書き込み (2008-06-17 15:40) より:

このコードを元に試しましたら、やはり
「"window.opener.document.forms['form1'].FormView1_TextBox2.value='" & Me.Button1.Text & "';</script>")」
の部分で、「window.opener.document が NULL またはオブジェクトではありません」と
いうエラーになってしまいました。
formID等再度確認します。



そうですね。
親画面を起動した時に「ソースの表示」で生成された HTML を見てみることをお薦めします。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-17 16:37
引用:

ぷりさんの書き込み (2008-06-17 15:40) より:

このコードを元に試しましたら、やはり
「"window.opener.document.forms['form1'].FormView1_TextBox2.value='" & Me.Button1.Text & "';</script>")」
の部分で、「window.opener.document が NULL またはオブジェクトではありません」と
いうエラーになってしまいました。



ということは windows.opener が null なのでしょう。
冬寂さんご指摘の内容に心当たりがないのであれば、ちょっと原因はわかりません。

問題の切り分けのために、HTMLを書いてみました。
これを現象が発生しているWebサーバ(ASP.NET開発サーバか、IIS)と同じところで動かしても問題が出るのであれば、環境の問題と言うことができると思います。

parent.html
コード:
<html>
<head>
<title>親ウインドウ</title>
</head>
<body>
<form id="form1" name="form1">
  <input id="text1" name="text1" type="text">
  <input id="button1" name="button1" type="button" onClick="window.open('child.html', 'child')" value="子画面を開く">
</form>
</body>
</html>



child.html
コード:
<html>
<head>
<title>子ウインドウ</title>
</head>
<body>
<form>
  <input type="button" onClick="window.opener.document.forms['form1'].text1.value = this.value" value="ほげほげ">
  <input type="button" onClick="window.opener.document.forms['form1'].text1.value = this.value" value="ふがふが">
</form>
</body>
</html>


未記入
常連さん
会議室デビュー日: 2007/02/21
投稿数: 29
投稿日時: 2008-06-17 20:58
子画面のHTML見ました?


>Protected Sub but_click(ByVal sender As Object, ByVal e As System.EventArgs)

>Dim txt As Button = 表示form.Row.FindControl(CType(sender, Button).Text)

>'スクリプトの実行
>ClientScript.RegisterStartupScript(Me.GetType(), _
>"hyouji", _
>"<script type='text/javascript'>" & _
>"window.opener.document.forms[FormView1].表示TextBox.value=txt</script>")

>End Sub

このコード実行すると、スクリプトがどこに挿入されたか理解してますか?
子画面のHTML上部に挿入され、‘表示TextBox’が生成される前に実行されますよ。

Dim btn As Button = FormView1.Row.FindControl("Button1")
Dim sbScript As New System.Text.StringBuilder()
sbScript.Append("var a = window.opener;")
sbScript.Append("if(a != null && a.closed == false){")
sbScript.Append(" var b = a.document.getElementById('textbox1');")
sbScript.Append(" if(b != null)")
sbScript.Append(" b.value = this.value;")
sbScript.Append(" }")
btn.Attributes("onclick") = String.Format(sbScript.ToString(), Page.Form.ClientID, txt.ClientID)

こんな感じでどうでしょう。VB知らないし動かしてないけど
重要なことは、
ちゃんとボタンにスクリプトが割り当てられていることを確認すること!
各ステップの意味を理解すること!そして、無駄を省くこと!
絶対にHTMLを確認してね〜。

>rainさん
.htmlで問題切り分けって、この質問を迷宮入りにしようと画策してます?



[ メッセージ編集済み 編集者: 未記入 編集日時 2008-06-17 21:00 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-06-17 21:02 ]
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-06-17 23:56
RegisterStartupScriptは、</form> の直前に挿入されます。
ですので、スレ主の用法自体は間違っていません。
http://msdn.microsoft.com/ja-jp/library/system.web.ui.page.registerstartupscript.aspx

ただ、どこで躓いているのか理解出来ていませんが・・・

FormViewはボリュームありますね〜。

ポストバックする必要あるのですか?
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2008-06-17 23:56
引用:

未記入さんの書き込み (2008-06-17 20:58) より:
子画面のHTML見ました?


>Protected Sub but_click(ByVal sender As Object, ByVal e As System.EventArgs)

>Dim txt As Button = 表示form.Row.FindControl(CType(sender, Button).Text)

>'スクリプトの実行
>ClientScript.RegisterStartupScript(Me.GetType(), _
>"hyouji", _
>"<script type='text/javascript'>" & _
>"window.opener.document.forms[FormView1].表示TextBox.value=txt</script>")

>End Sub

このコード実行すると、スクリプトがどこに挿入されたか理解してますか?
子画面のHTML上部に挿入され、‘表示TextBox’が生成される前に実行されますよ。


window.opener.document.forms[FormView1].表示TextBox とは、親画面のオブジェクトと思うのですが、親画面が表示される前に子画面のスクリプトが実行される、という事でしょうか?

ンー。プログラムの作り方とネットワークの状況によってはそういう事が起こる可能性もないでもなさそうだけど・・・普通、無いんじゃない?
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-06-18 08:05
ひろれい様、rain様、未記入様、ぴあちゃん様、冬寂様 ありがとうございます。

今回、皆様のおかげで希望する動作に辿り着く事ができました。

皆様から頂いたご助言通り、理解度を深たいと思います。

また質問する事があると思いますが宜しくお願いします。

本当にありがとうございました。

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