- PR -

親画面にある値の取得方法

投稿者投稿内容
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-09-08 13:29
お世話になります。

VB2005にてWEBアプリケーションを作成しております。

親画面から子画面を開いた際に、

親画面のGridviewにあるLabelの値を子画面で取得したいです。


GridViewにTempleteFieldを設け、そこにButtonをおきました。

このButtonを押すと子画面が開きます。

この時にButtonを押した行のLabelの値を子画面のテキストボックスへ取得したいのですが、

方法がわかりません。

宜しくお願いします。

もん吉
常連さん
会議室デビュー日: 2008/05/16
投稿数: 36
投稿日時: 2008-09-08 13:40
JavaScriptでやることですね。

google先生に聞いてみればイヤというほどサンプルが見るかると思います。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-09-08 14:00
引用:

ぷりさんの書き込み (2008-09-08 13:29) より:

親画面から子画面を開いた際に、
親画面のGridviewにあるLabelの値を子画面で取得したいです。



場合にもよりますが、発想を逆転させてみるのはどうでしょう。
「親画面の値を子画面から取得する」のではなく、
「子画面を開くときに、必要な値を親画面から渡す」ってな具合に。
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-09-08 15:30
もん吉様 ありがとうございます。

早速、サンプルをあたってみます。


rain様、ありがとうございます。

必要な値を親画面から渡す方法として、
「FindControl」を使用するのかなと思ったのですが、
GridviewでButtonを押した行のLabelをFindControlで取得しようと
しましたが、記述方法がわかりませんでした。
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-09-09 15:03
色々調べてみて「session」を使用する事がわかりました。

インターネットでサンプルがあったので、試してみたのですが子画面で値が取得できません。

どこがおかしいのか、ご指摘お願い致します。


親.aspx.vb

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand

Dim grid As GridView = TryCast(sender, GridView)

If grid Is Nothing Then
Exit Sub
End If

If e.CommandName = "完了" Then

Dim index As Integer = Convert.ToInt32(e.CommandArgument)
Context.Session("番号") = e.CommandArgument
Context.Session("品名") = CType(grid.Rows(index).FindControl("Label6"), Label).Text
End If
End Sub

Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

If Not e.Row.RowType = DataControlRowType.DataRow Then
Exit Sub
End If

Dim row As GridViewRow = e.Row
Dim btn As Button = CType(row.Cells(0).FindControl("完了"), Button)

btn.CommandArgument = e.Row.RowIndex

Dim scriptsource As String

scriptsource = "javascript:window.open('子.aspx','subwin','width=300,height=300,menubar=no,tollbar=no');"

btn.OnClientClick = scriptsource

End Sub



子.aspx.vb

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

Dim hin As TextBox = 子.Row.FindControl("品名TextBox")

hin.Text = Session("Label6")

End Sub
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-09-09 16:47
一番下の方に
hin.Text = Session("Label6")

とありますが、Session("Label6") って何ですか?
あと、列の番号をSessionに格納する理由も解せないのですが…
渡したいのは品名ですよね?

---

別解になりますが、改ざんされて困るようなデータでないのなら、
テンプレートのボタンのOnClientClickをデータバインドの設定で

Eval("品名", "window.open('child.aspx?hinmei={0}'); return false;")

という具合にしてやれば一発ですね。
あとは子画面のRequest.QueryString("hinmei")で取得するだけと。

_________________
//---
 あやのこうじ@RapidExpress

[ メッセージ編集済み 編集者: RapidExpress 編集日時 2008-09-09 16:48 ]
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-09-09 18:06
RapidExpress様、ありがとうございます。

hin.Text=Session("品名")の間違いでした。

RapidExpress様より頂いた別解で試してみましたが、

「オブジェクトを指定してください。」というjavascriptのエラーが出てしまいました。

再度、調べてみます。

RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-09-10 10:05
こんにちわ。

javascriptのエラーと直接関係はないと思いますが、
ちょっと安直過ぎたところがあったので訂正させてください。

コード:
    親.aspx
	
    <script runat="server">
        Private Function OpenChild(ByVal arg As String) As String
            If arg.Length Then
                Return String.Format("window.open('child.aspx?hinmei={0}');", HttpUtility.UrlEncode(arg))
            Else
                Return ""
            End If
        End Function
    </script>
    
    TemplateFieldにあるボタン
    OnClientClick='<%# OpenChild(Eval("品名").ToString) %>'



これでおそらく大丈夫なはず。

あともう一点。私も気付くのが今さらで恐縮なんですが、
現状のSessionでの受け渡しというのはまずいような気がします。OnClientClickで
ウィンドウを開いてしまうと、子のページがSessionを参照する前に親がSessionの
値を設定しているという保証がないからです。(仮に取得できていてもそれは偶然)

親が値をセットしたことを保証するには、OnClientClickで開かせるのではなく、
サーバから処理が返された時に開かせるようにする必要があります。
コード:
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand 
	Dim grid As GridView = TryCast(sender, GridView) 

	If grid Is Nothing Then 
	    Exit Sub 
	End If 

	If e.CommandName = "完了" Then 
	    Dim index As Integer = Convert.ToInt32(e.CommandArgument) 
	    Context.Session("品名") = CType(grid.Rows(index).FindControl("Label6"), Label).Text
	    ClientScript.RegisterStartupScript(Me.GetType, "OPEN", "window.open('child.aspx');", True)
	End If 
End Sub

#RowCreatedでのOnclientClickの設定は外す。 


ただしこの方法はポップアップブロックに引っ掛かりますので注意が必要です。
_________________
//---
 あやのこうじ@RapidExpress

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