- PR -

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

投稿者投稿内容
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-06-17 11:07
RapidExpress様、ありがとうございます。

はい、その通りです。

希望する動作は、

「親ウィンドウ」のFormViewにあるボタンを押すと、「子ウィンドウ」が開きます。

「子ウィンドウ」の中にある「ボタン」を押したら、
親ウィンドウのFormViewの中にある「表示TextBox」に「子ウィンドウ」で押したボタンのテキストを代入したいのです。

調べてみて、「window.opener.document.MainForm.textbox.value」で
親ウィンドウに値を代入できる様な事が書いてあったのですが、
使用方法が間違っていますでしょうか?
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-06-17 11:17
ひろれい様、ありがとうございます。

早速試してみます。


引用:
できれば、スルーして欲しかったですね



申し訳ございませんでした。


rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-17 11:20
引用:

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

ご助言頂いている身分で恐縮ですが、
理解が足りないからこそ時間をかけて、インターネットや参考書を広げて自身なりに調べています。(この質問内容だけで3日間)
理解出来ているのであれば、質問はしないと思います。



気を悪くされたようですみません。
お詫びになるかどうかわかりませんが、いつもよりがんばって回答しますので許してください。

さて、提示されたコード(そのままではありませんが)で動かしてみたのですが、私の環境では
「window.opener.document.forms.FormView1 が null またはオブジェクトではありません」と怒られてしまいました。
コードを読む限りでは window.opener.document が null になるような原因は見あたりませんでしたが、ぷりさんの 「"window.opener.document."はNULLかオブジェクトではありません。」の document の後にドットがあるのが気になりました。
もしかすると、null なのは document ではなく、そのさらに奥(?)にある別の何かではないか、と思いました。

…と書いている間に回答が増えているみたいですので、一旦ここで送信します。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2008-06-17 11:22
openerは、親画面がリロードしたり遷移したりすると無効になりますが、それじゃないっすかね?

# .NETとか言ってないで、ただのHTMLにJavascriptを書いて勉強してみるといいですよ。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-17 11:31
引用:

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

調べてみて、「window.opener.document.MainForm.textbox.value」で
親ウィンドウに値を代入できる様な事が書いてあったのですが、
使用方法が間違っていますでしょうか?



その中にあらわれる MainForm とは、親画面のHTML中でいう <form id="ほにゃらら"> の「ほにゃらら」の部分になります。
textbox とは、同じく親画面のHTML中でいう <input type="text" id="ふにゃらら" ...>の「ふにゃらら」の部分になります。
これらのIDは、普通は子画面からはわかりませんので、window.open で hyouji.aspx を開くときに、クエリ文字列などでIDの文字列を渡してあげるとよいと思います。
# よい方法かどうかは実はあまり自信がありませんが、私は実際にそうしています。

で、HTML中にあらわれるIDは、デザイナ上にコントロールを置いたときにつけられるIDとは異なります。例えばFormView内に何かTextBoxを置くと、HTML中にあらわれるIDは 「FormView1_TextBox1」みたいな感じになります。これを取得するには、サーバ側のコードからは TextBox1.ClientID で取得でき、クライアント側のaspxに埋め込みたい場合は
<% = TextBox1.ClientID %> で可能です。

なお、MainFormにあたる部分のクライアント側のIDは、Page.Form.ClientID で取得できます。

# すぐには分からないかもしれませんが、それは私の説明が下手なだけですのであまり気にしないでください。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2008-06-17 12:59
FormView の使い方があっているかどうか自信ありませんが、とりあえず出来るようですね。

親画面
コード:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim sbScript As New System.Text.StringBuilder()
        Dim btn As Button = CType(FormView1.FindControl("Button2"), Button)

        sbScript.Append("ret = window.open('hyouji.aspx','hyouji','Width=300,Height=300;');")
        sbScript.Append("return false;")
        btn.Attributes("onclick") = sbScript.ToString()

    End Sub



子画面
コード:
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        'スクリプトの実行 
        ClientScript.RegisterStartupScript(Me.GetType(), _
        "hyouji2", _
        "<script type='text/javascript'>" & _
        "window.opener.document.forms['form1'].FormView1_TextBox2.value='" & Me.Button1.Text & "';</script>")
    End Sub


rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-17 13:03
言葉で説明しようとしましたがうまくいかなかったので、ひろれいさんのコードのFormView版を書いてみました。

[追記]
※投稿が前後しましたが、参考にしたのは 2008-06-17 11:01 のひろれいさんのコードです。
[/追記]


先ほど私が書いた通り、子画面を開くときに、クエリ文字列で親画面のフォームとテキストボックスのIDを渡しています。
子画面はそれを使って、親画面のテキストボックスを操作します。

親 Window
コード:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

' FormView1 の InsertItemTemplate に TextBox1 と Button1 を配置
Dim txt As TextBox = FormView1.Row.FindControl("TextBox1")
Dim btn As Button = FormView1.Row.FindControl("Button1")

Dim sbScript As New System.Text.StringBuilder()

sbScript.Append("ret = window.open('hyouji.aspx?FormID={0}&TextID={1}','hyouji','Width=300,Height=300;');")
sbScript.Append("return false;")
btn.Attributes("onclick") = String.Format(sbScript.ToString(), Page.Form.ClientID, txt.ClientID)

End Sub



子 Window
コード:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim formname As String = Page.Request.QueryString("FormID")
Dim textname As String = Page.Request.QueryString("TextID")
Dim txt As String = CType(sender, Button).Text

' ちなみに document.forms['ほげほげ'] は document.ほげほげ でもOK
Dim script As String = "<script type='text/javascript'>" & _
"window.opener.document.forms['{0}'].{1}.value='{2}';</script>"

'スクリプトの実行
ClientScript.RegisterStartupScript(Me.GetType(), _
"hyouji", _
String.Format(script, formname, textname, txt))

End Sub



どういった JavaScript を埋め込もうとしているか、デバッグ実行で動きを確認してみてください。

[ メッセージ編集済み 編集者: rain 編集日時 2008-06-17 13:05 ]
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-06-17 15:40
rain様、ひろれい様、冬寂様 ありがとうございます。


ひろれい様

コードありがとうございます。

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


rain様

こちらこそ、大変申し訳ありませんでした。
自身で調べても、その調べ方が正しいのかどうか分からなくなってしまい焦っていました。

コードありがとうございます。

このコードを元に試しましたら、
「識別子がありません。」というエラーが出てしまいました。
多分、子ウィンドウの「"hyouji", _」という部分を指していると思います。

デバックして親ウィンドウの中を確認したら、
「Dim txt As TextBox = FormView1.Row.FindControl("TextBox1")」の
「txt」部分には子ウィンドウで押したボタンのテキストが入っているのですが・・・

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