none
ASP.NET2.0で、GridViewからの画面遷移方法とSessionオブジェクトについて RRS feed

  • 質問

  • ASP.NET2.0で、GridViewからの画面遷移方法とSessionオブジェクトについて,

    教えてください。

     

    例)

    A画面一覧を選択して、 選択された詳細情報を表示される画面に遷移するように画面設計をしています。

     

    ・A画面で、DBの一覧画面を表示した後、一覧の一部を選択する。

    ・B画面に遷移し、選択された条件のキーより、詳細情報を表示する画面を考えています。

     

    イメージ

    A画面
    -------------------------------------------------------------
    |A |B |CCCC |DDD|              |
     ------------------------------------------------------------
    |A1|B1|CCCC1|DDD1|             |
     -------------------------------------------------------------
    |A2|B2|CCCC2|DDD2|             |   
     -------------------------------------------------------------

     

    CCCCを選択し、B画面に遷移する。

     

    B画面  CCCCレコードの詳細画面を表示。


    -----------------------------------------
    |表示 |CCCC|     |
     ---------------------------------------
    |表示1|DDDD|     |
     ---------------------------------------
    |表示2|EEEE|      |
     ---------------------------------------

     

     

     

    ・A画面

    Grid Viewを使用して作成しています。例の「CCCC」列フィールドに、Buttonfiledにて、画面を表示して、別の画面に遷移するように、考えています。

    ImageUrlに画面遷移先urlを指定。(B画面)

     

    ・A画面のSessionオブジェクトにDBのキーとなる選択されたデータのキー項目を格納し、B画面にキーを渡して、画面を表示したいと考えています。

     

    プログラム作成する際の参考とURLを教えてください。

    また、A画面のSessionオブジェクトの設定方法と、B画面のSessionオブジェクトの受け取り方法を具体的な、コーディング例等を教えてださい。

    よろしくお願いします。

     

    A,B画面ともに参照画面です。

     

    使用でしている開発ツールは、以下の通りです。

    VS2005 Express Edition
    Framework Ver 2.0を使用
    VBにて開発

     

    不明点等は、問い合わせください。

     

     

     

     

     

    2008年7月23日 3:05

回答

  • > できれば、VB言語で記述されたサンプルをA画面について、提供してもらえないでしょうか?

     

    今、夏休みで暇なので・・・

     

    Code Snippet

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        Dim btn As String = String.Empty
           
        Function CreateDataTable() As DataTable
            Dim dt As DataTable = New DataTable()
            Dim dr As DataRow

            dt.Columns.Add(New DataColumn("Code", GetType(Int32)))
            dt.Columns.Add(New DataColumn("Name", GetType(String)))
            dt.Columns.Add(New DataColumn("Price", GetType(Int32)))
          
            Dim i As Integer
            For i = 0 To 8
                dr = dt.NewRow()
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 123 * (i + 1)
                dt.Rows.Add(dr)
            Next i
           
            Return dt
        End Function

        Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
            Session("Code") = GridView1.SelectedRow.Cells(0).Text
            Session("Name") = GridView1.SelectedRow.Cells(1).Text
            Session("Price") = GridView1.SelectedRow.Cells(2).Text

            If btn = "Button1" Then
                Response.Redirect("Page_B.aspx")
            End If

            If btn = "Button2" Then
                Response.Redirect("Page_C.aspx")
            End If
        End Sub

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not Page.IsPostBack Then
                GridView1.DataSource = CreateDataTable()
                GridView1.DataBind()
                Return
            End If
           
            Dim formCollection As NameValueCollection = Page.Request.Form
            Dim keys As String() = formCollection.AllKeys
            For Each id As String In keys
                Dim control As Control = Page.FindControl(id)
                If TypeOf control Is Button Then
                    btn = CType(control, Button).ID
                    Exit For
                End If
            Next id
        End Sub
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onselectedindexchanged="GridView1_SelectedIndexChanged" >
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="コード" />
                    <asp:BoundField DataField="Name" HeaderText="商品名" />
                    <asp:BoundField DataField="Price" HeaderText="単価" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CommandName="Select" Text="To B" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button2" runat="server" CommandName="Select" Text="To C" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>  
            </asp:GridView>   
        </div>
        </form>
    </body>
    </html>

     

     

     

    2008年8月6日 11:16
  • 他のスレッドを見ていて思ったのですが、以下のコードの方が分かりやすく

    かつスマートなような気がします。ご参考まで。

     

    Code Snippet

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        Function CreateDataTable() As DataTable
            Dim dt As DataTable = New DataTable()
            Dim dr As DataRow

            dt.Columns.Add(New DataColumn("Code", GetType(Int32)))
            dt.Columns.Add(New DataColumn("Name", GetType(String)))
            dt.Columns.Add(New DataColumn("Price", GetType(Int32)))
          
            Dim i As Integer
            For i = 0 To 8
                dr = dt.NewRow()
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 123 * (i + 1)
                dt.Rows.Add(dr)
            Next i
           
            Return dt
        End Function
       
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not Page.IsPostBack Then
                GridView1.DataSource = CreateDataTable()
                GridView1.DataBind()
            End If
        End Sub

        Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
            If e.Row.RowType = DataControlRowType.DataRow Then
                CType(e.Row.FindControl("Button1"), Button).CommandArgument = e.Row.RowIndex.ToString()
                CType(e.Row.FindControl("Button2"), Button).CommandArgument = e.Row.RowIndex.ToString()
            End If
        End Sub

        Protected Sub Button_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
            Dim row As GridViewRow = GridView1.Rows(Int32.Parse(e.CommandArgument))
            Session("Code") = row.Cells(0).Text
            Session("Name") = row.Cells(1).Text
            Session("Price") = row.Cells(2).Text

            If e.CommandName = "Button1" Then
                Response.Redirect("Page_B.aspx")
            End If

            If e.CommandName = "Button2" Then
                Response.Redirect("Page_C.aspx")
            End If
        End Sub
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onrowdatabound="GridView1_RowDataBound">
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="コード" />
                    <asp:BoundField DataField="Name" HeaderText="商品名" />
                    <asp:BoundField DataField="Price" HeaderText="単価" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CommandName="Button1" Text="To B"
                                oncommand="Button_Command" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button2" runat="server" CommandName="Button2" Text="To C"
                                oncommand="Button_Command" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>  
            </asp:GridView>     
        </div>
        </form>
    </body>
    </html>

     

     

    2008年8月7日 12:11

すべての返信

  • GridViewで選択された行はSelectedDataKeyなどで取得可能です。

    SessionオブジェクトはVBの場合は簡単で、単に、Session("hoge") = fugaで設定、fuga = Session("hoge") で取得できます。

    ページの遷移はResponse.Ridirectを使えば良いでしょう。

     

    以下、サンプルです。ただし、以下のサンプルの画面遷移はPanelを使ってコントロールしています。つまり、GridViewとDetailsViewをそれぞれのPanelに入れ、それぞれのPanelの表示・非表示を行うことにより、ページを遷移しています。(というかページを遷移しているように見せています。)

     

    GridView SelectedDataKey Example
    http://authors.aspalliance.com/aspxtreme/sys/web/ui/webcontrols/demos/GridViewSelectedDataKey.aspx

    2008年7月23日 5:21
    モデレータ
  • trapemiya

     

    早速の回答ありがとうございます。

     

    GridViewで選択された行はSelectedDataKeyなどで取得可能です。

    ⇒SelectedDataKeyについて、調べていますが、まだ、使用方法が、よくわからない状態です。

    他に参考になるURLまたは、指定方法、記述方法等を教えてください。

     

    よろしくお願いします。

     

     

    2008年7月24日 11:58
  • GridViewのDataKeyNamesプロパティに主キーを表すフィールドを指定します。この主キーのフィールドが1つしかない場合は、GridView.SelectedValue プロパティ、もしくはGridView.SelectedDataKey.Valueで、選択した行の主キーの値が取れます。
    DataKeyNamesプロパティに複数の主キーのフィールドを指定した場合は、GridView.SelectedDataKey.Values(0)や、GridView.SelectedDataKey.Values("複数の主キーフィールドのうちの名前の一つ") で値が取れます。
    上で得られる値はいずれもObject型なので、適当にキャスト、もしくはToString()でstring型にして下さい。

     

    以下にサンプルも載っています。また、私が前回紹介したページでも、SelectedDataKeyを使ったコードを見ることができます。

     

    GridView.SelectedDataKey プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.selecteddatakey(VS.80).aspx

     

    GridView.SelectedValue プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.selectedvalue(VS.80).aspx

    2008年7月24日 15:13
    モデレータ
  •  

      trapemiya 様へ

     

    早速の回答ありがとうございました。

     

    「GridView.SelectedDataKey.Values("複数の主キーフィールドのうちの名前の一つ") で値が取れます。」

    ご指摘のとおり、修正しましたが、次画面に遷移後のキー項目お受け渡しが、うまくいっていないようです。

     

    対応方法を、教えてください。 よろしくお願いします。

     

     

    行の指定に3項目のキーを受け渡して、キーを元に詳細画面を表示させていと考えています。

     

    例)

    A画面にて、以下のように、GridViewにて選択されるキーの値を求めて、Sessionに設定するように、作成しました。

     

    Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

            Dim productcd1 As String = CType(GridView1.SelectedDataKey("productcd"), String)
            Dim seriesnumber1 As String = CType(GridView1.SelectedDataKey("seriesnumber"), Int32)
            Dim familynumber1 As String = CType(GridView1.SelectedDataKey("familynumber"), Int32)
            Session("syouhin.aspx.productcd") = productcd1
            Session("syouhin.aspx.seriesnumber") = seriesnumber1
            Session("syouhin.aspx.familynumber ") = familynumber1
        End Sub

    画面遷移方法は、以下のように定義しました。

    HyperLinkFieldのプロパティのNavigateUrlに、遷移先のaspxを指定。

     

    B画面のFormViewタスク Selectステートメントの構成で、WHERE句の主キー

    のソ-スにSessionを選択し、各3つのキーを選択した状態で、テストしています。

    (キーを直接指定した場合は、画面が表示されます。)

     

    A画面から、B画面へ遷移しますが、A画面のキーの詳細情報が表示されていない状態です。

     

    原因を調べたいのですが、指定ミスまた、定義方法誤り等について、ご指摘ください。

     

    どうぞ、よろしくお願いします。

     

    以上

     

     

    2008年7月25日 2:41
  •  tanuyoshi さんからの引用

    A画面から、B画面へ遷移しますが、A画面のキーの詳細情報が表示されていない状態です。

     

    ここはどのように確認されたのでしょうか? B画面でSession変数から値は取れているのでしょうか? もし取れているのでしたら、select文の辺りを見せて下さい。

    2008年7月25日 2:53
    モデレータ
  •  trapemiya 様へ

     

    早速の回答ありがとうございます。

     

    ご指摘のB画面のselect文は、以下のような記述です。

     

     

    <asp: SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:商品情報登録ConnectionString9 %>"
                SelectCommand="SELECT * FROM [商品情報] WHERE (([productcd] = @productcd) AND ([seriesnumber] = @seriesnumber) AND ([familynumber] = @familynumber))">
                <SelectParameters>
                    <asp: SessionParameter Name="productcd" SessionField="syouhin.aspx.productcd" Type="String" />
                    <asp: SessionParameter Name="seriesnumber" SessionField="syouhin.aspx.seriesnumber"
                        Type="Int32" />
                    <asp: SessionParameter Name="familynumber" SessionField="syouhin.aspx.familynumber"
                        Type="Int32" />
                </SelectParameters>
            </asp: SqlDataSource>

     

    B画面でSession変数から値がとているのか、参照したいのですが、デバッグ機能がうまく使いこなせていないため、参照できない状態です。

     

    どのような状態になっているか切り分けたいので、デバック方法、例)Session変数が、わかる方法があれば、教えてください。

     

    よろしくお願いします。

     

    以上

     

    2008年7月25日 4:11
  • 問題の原因ではないかもしれませんが、以下のコードが変だと思いま

    すが・・・

     

    > Dim seriesnumber1 As String = CType(GridView1.SelectedDataKey("seriesnumber"), Int32)
    > Dim familynumber1 As String = CType(GridView1.SelectedDataKey("familynumber"), Int32)

     

    C# だとコンパイルエラーです。型チェックの甘い VB(C# と同様に厳しく
    するオプションがあるそうですが)の場合はコンパイラは通のかもしれま
    せんが。

    2008年7月25日 4:12
  •  tanuyoshi さんからの引用

    B画面でSession変数から値がとているのか、参照したいのですが、デバッグ機能がうまく使いこなせていないため、参照できない状態です。

     

    デバッグできないと、この先、開発が大変になりますので、まずデバッグできるようにした方が良いと思います。

    ブレークポイントを設定すると、そこで止まりますか?
    2008年7月25日 4:36
    モデレータ
  •   trapemiya

     

    デザインにて、画面を表示すると、デバッグのブレークポント設定のツール画面が参照でき、表示されます。

     

    ソースを開くと、デバッグのブレークポイントの設定する表示が、ないため、できない状態です。

    (「デバッグ」-「ブレークポイントの設定/解除」が表示されていない。)

     

    困っています。よりよい対応方法を教えてください。

     

    どうぞ、よろしくお願いします。

     

    電話等で、相談して、回答を得られる相談窓口等は、ないでしょうか?

     

    以上

     

     

    2008年7月25日 6:14
  •  tanuyoshi さんからの引用

    ソースを開くと、デバッグのブレークポイントの設定する表示が、ないため、できない状態です。

    (「デバッグ」-「ブレークポイントの設定/解除」が表示されていない。)

     

    このような話はあまり聞いたことがないのですが、グレーアウトしてるわけでも無いのですね?

     

    とりあえず、セッション変数の内容を見るには、

     

     System.Diagnostics.Debug.WriteLine("syouhin.aspx.productcd -> " & Session("syouhin.aspx.productcd"))

     

    と書いて、デバッグメニューからデバッグ開始でアプリケーションを開始して見てください。

    出力ウインドウに内容が書き出されているはずです。

     

    もし、デバッグが開始できなければ、古典的な方法ですが、以下をPage_Load辺りに書いてみてください。

     

    Response.Write("syouhin.aspx.productcd -> " & Session("selectCommnad"))
    Response.End()


    あと、GridView1に、以下の記述がありますでしょうか?

     

    OnSelectedIndexChanged="GridView1_SelectedIndexChanged"

     

     tanuyoshi さんからの引用

    電話等で、相談して、回答を得られる相談窓口等は、ないでしょうか?

     

    MSDNにインシデントをお持ちであれば、そこでサポートを受けられると思います。

    2008年7月25日 8:11
    モデレータ
  •  

     trapemiya様へ

     

    早速の回答ありがとうございました。

     

    以下の箇所を試したみました。

     

    1)セッション変数の内容を見る方法の確認

    ~~~~~

    とりあえず、セッション変数の内容を見るには、

     

     System.Diagnostics.Debug.WriteLine("syouhin.aspx.productcd -> " & Session("syouhin.aspx.productcd"))

     

    と書いて、デバッグメニューからデバッグ開始でアプリケーションを開始して見てください

    ~~~~

     

    出力ウインドウに内容の確認していますが、内容が表示されていない状態です。

    デバッグ表示の指定箇所が悪いのかも知れません。

    指定箇所等の、位置を教えてください。

     

    2) また、以下の点のついて確認しました。

     

    ~~~~~~~~

    あと、GridView1に、以下の記述がありますでしょうか?

     

    OnSelectedIndexChanged="GridView1_SelectedIndexChanged"

     

    ~~~

    以下のように、記述しています。

    指定に問題があるようでしたら、指摘ください。

    よろしくお願いします。

     

     GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

     

    3)MSDNにインシデントについて

    MSDNにインシデントを、もっていてば、電話等の回答がえられるようですが、

    今回、持っていないため、回答依頼ができない状態です。(サポートが受けられない状態です。)

     

    電話等の対応が、難しいようなので、フォーラムで、FAQしますので、よろしくお願いします。

    情報が不足している部分があると、思いますので、指摘ください。

    指摘箇所について、説明していきますので、対応をよろしくお願いします。

     

    以上

     

     


     

    2008年7月28日 4:45
  •  tanuyoshi さんからの引用

    出力ウインドウに内容の確認していますが、内容が表示されていない状態です。

    デバッグ表示の指定箇所が悪いのかも知れません。

    指定箇所等の、位置を教えてください。


    先にも書きましたが、Page_Loadの中でかまいません。デバッグからデバッグ開始でアプリケーションを開始されていると思いますが、その通りでしょうか?

     

    また、何らかの原因でDebug.Writelineが動作しないのであれば、Labelを一つ用意して、

    Label1.Text = Session("syouhin.aspx.productcd")
    などとして表示できるか確かめてみて下さい。

     

     tanuyoshi さんからの引用

     GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

    すみません。VBでした。この記述で大丈夫です。
    ところでこの行で右クリックして、ブレークポイントの挿入はできるのでしょうか?

    2008年7月28日 6:39
    モデレータ
  •  

    trapemiya 様へ

     

    早速の回答ありがとうございます。

     

    指摘された点についての回答です。

    ~~~~~

    ところでこの行で右クリックして、ブレークポイントの挿入はできるのでしょうか?

    ~~~~

    ⇒ブレークポイントの挿入ができました。

    デバッグ開始で起動してみましたが、画面遷移時の情報がわかりませんでした。

    出力画面に内容が表示されていませんでした。

     

    再度、内容を確認して、テストしてみます。

     

    何か、ご助言ありましたら、どうぞよろしくお願いします。

     

    以上

     

     

    2008年7月28日 11:25
  •  tanuyoshi さんからの引用

    ⇒ブレークポイントの挿入ができました。

    デバッグ開始で起動してみましたが、画面遷移時の情報がわかりませんでした。

     

    ブレークポイントは赤丸でしょうか? また、GridViewの行を選択した際に、ブレークポイントで停止しましたか?

    停止しない場合は、以下が当てはまるかもしれません。

     

    [PRB] ASP.NET ページのデバッグ時に Visual Studio .NET デバッガがブレークポイントで停止しない
    http://support.microsoft.com/kb/306169/ja

     

    web.config debug=true にしてもブレークポイントに止まらない
    http://dobon.net/vb/bbs/log3-33/20296.html

     

    Visual Studio2005でASP.NETのWebサイトのブレークポイントが停止しない件(Vista編)
    http://blog.kansai.com/inspirace48/259

    2008年7月28日 14:04
    モデレータ
  •  trapemiya

     

    早速の回答ありがとうございます。

     

    返信が遅れてすいません。ご指摘の部分を確認しましたので、回答します。

     

    ブレークポイントは赤丸でしょうか? また、GridViewの行を選択した際に、ブレークポイントで停止しましたか?

    停止しない場合は、以下が当てはまるかもしれません。

     

    1)ブレクポイントは赤丸です。

    2)ブレークポイントで停止しませんでした。(原因不明)

    画面は、遷移した

     

    停止しない場合のパターンを調査中です。わかり次第回答します。

     

    デバッグ方法はこのまま調査しますが、  最初のQAのSession情報取得がうまく取得できない状態を解決する方法で、何かよい手段がわかれば教えてください。

     

    A画面と遷移先B画面の設定方法について、ソースを再度、確認したいと思います。

    内容確認で、参考Jとなる事例集等ありましたら、教えてください。

    どうぞ、よろしくお願いします。

     

    以上 

    2008年8月1日 9:19
  • ブレークポイントで止まらないなどデバッグ環境がうまく動いていないとなれば、先に紹介したResponse.WriteとResponse.Endを使ってデバッグする方法があります。とりあえず以下のようにした場合、セッション変数の値が表示されますか?
    このようにして、どこまで動いてどこから動かなくなるのかを、まず見つけた方が良いでしょう。

     

    Code Snippet

    Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

            Dim productcd1 As String = CType(GridView1.SelectedDataKey("productcd"), String)
            Dim seriesnumber1 As String = CType(GridView1.SelectedDataKey("seriesnumber"), Int32)
            Dim familynumber1 As String = CType(GridView1.SelectedDataKey("familynumber"), Int32)
            Session("syouhin.aspx.productcd") = productcd1
            Session("syouhin.aspx.seriesnumber") = seriesnumber1
            Session("syouhin.aspx.familynumber ") = familynumber1

     

            Response.Write(Session("syouhin.aspx.productcd") )
            Response.End()
    End Sub

     

     


    2008年8月1日 15:17
    モデレータ
  •  

    trapemiya 様へ

    早速の回答ありがとうございます。

     

    ・指摘のとおり、修正しましたが、セッション変数の値が表示されない状態です。

     

    遷移方法が、間違っていると思われますので、確認したいので、教えてください。

     

    GridViewの列編集で、buttomFieldとHyperLinkFieldを使用して、画面遷移先urlを指定しています。

    LinkButtomのPostBackurlに遷移先を指定すると、セッション変数の値が使用できるのでしょうか?

     

    GridViiewの使用方法が間違っているのでしょうか?

    確認です。

    どうぞ、よろしくお願いします。

     

    以上


    2008年8月4日 10:47
  •  tanuyoshi さんからの引用

    LinkButtomのPostBackurlに遷移先を指定すると、セッション変数の値が使用できるのでしょうか?

     

    これは関係ないと思います。ポストバックは通常同じページでやり取りを行いますが、PostBackurlは違うページへポストバックする際に使用します。

     

     tanuyoshi さんからの引用

    GridViewの使用方法が間違っているのでしょうか?

     

    Response.Writeした結果は空白の真っ白なページなのでしょうか? だとすれば、productcd1、seriesnumber1、familynumber1

    に値が入っていないのかもしれません。

    System.Diagnostics.Debug.Printは動きますか? 「デバッグ開始」でSystem.Diagnostics.Debug.Printの出力が、「出力」ウインドウに表示されますか? 表示されなければ、やはりResponse.WriteとResponse.Endを用いて、productcd1、seriesnumber1、familynumber1の値を確かめてみて下さい。たぶんここに値が入っていないと思われますので、もし、値が入っていなければ、DataKeyNamesが正しく設定されているか確認してみて下さい。

    2008年8月4日 11:39
    モデレータ
  • GridView1_SelectedIndexChanged メソッドの一番最後に、

     

    Response.Redirect("xxx.aspx")

     

    としてやればうまく行きそうな気がしますけど。

     

    > buttomFieldとHyperLinkFieldを使用して、画面遷移先urlを指定しています。

     

    意味不明ですが、次の画面に飛ぶ前に Session("xxxx") が設定されていますか?

     

    #全角、半角はきちんと区別して使いましょう。引用は > を使いましょう。

    2008年8月4日 11:43
  • trapemiya 様へ

     

    早速の回答ありがとうございます。

     

    デバッグできない原因が、分かりました。

    選択されるフィールドの指定誤りでした。

     

    以下の指定をしたところ、デバッグ機能も使用でき、productcd1、seriesnumber1、familynumber1

    の値が参照できました。

     

    ButtonField列にある選択されたフィールドのCommandNameプロパティに"Select"
    を指定していなかったために、発生していました。

     

    画面遷移し、該当情報の詳細画面を表示することができました。

     

    いろいろ、ご教授ありがとうございました。

     

     

    2008年8月5日 11:26
  •  SurferOnWww

     

    早速の回答ありがとうございました。

     

     指摘のとおり、実施し、画面遷移できました。

    ありがとうございます。

     

    >GridView1_SelectedIndexChanged メソッドの一番最後に、

     

    >Response.Redirect("xxx.aspx")

     

    >としてやればうまく行きそうな気がしますけど。

     

    また、以下の指摘事項について回答します。

     

    >意味不明ですが、次の画面に飛ぶ前に Session("xxxx") が設定されていますか?

     

    Session("xxxx") を設定しいます。

     

    >#全角、半角はきちんと区別して使いましょう。引用は > を使いましょう。

     

    指摘のとおり、区別できるように、記述します。

     

    A画面→B画面に遷移できました。

    今度は、A画面→C画面に遷移できるようにしたいのですが、選択された行からは、

        GridView1_SelectedIndexChangedに遷移している選択列がわからないため、今は、B画面に無条件で遷移するようになっています。

    C画面に遷移できるように、判定をしたいのですが、判定方法の参考例を教えてください。

    よろしくお願いします。

     

    以上

     

     

     

    2008年8月6日 3:03
  • > 今度は、A画面→C画面に遷移できるようにたいのですが、選択された行からは、
    > GridView1_SelectedIndexChangedに遷移している選択列がわからないため、
    > 今は、B画面に無条件で遷移するようになっています。
    > C画面に遷移できるように、判定をしたいのでが、判定方法の参考例を教えてください。

     

    上記の意味がよく分かりませんが、ボタンを2つ設けておいて、一方がクリ
    ックされたら B 画面へ、他方がクリックされたら C 画面へ飛ぶようにした
    いということでしょうか?

     

    であれば、以下のような感じで実現できると思います。Page_B.aspx,
    Page_C.aspx の例までは示してませんが、何か適当なものを作って試してみ
    てください。

     

    Code Snippet

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        string btn;

        DataTable CreateDataTable()
        {
            DataTable dt = new DataTable();
            DataRow dr;

            dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
            dt.Columns.Add(new DataColumn("Name", typeof(String)));
            dt.Columns.Add(new DataColumn("Price", typeof(Int32)));

            for (int i = 0; i < 9; i++)
            {
                dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "Item " + i.ToString();
                dr[2] = 123 * (i + 1);
                dt.Rows.Add(dr);
            }
            return dt;
        }
       
        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Session["Code"] = GridView1.SelectedRow.Cells[0].Text;
            Session["Name"] = GridView1.SelectedRow.Cells[1].Text;
            Session["Price"] = GridView1.SelectedRow.Cells[2].Text;

            if (btn == "Button1")
            {
                Response.Redirect("Page_B.aspx");
            }

            if (btn == "Button2")
            {
                Response.Redirect("Page_C.aspx");
            }

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridView1.DataSource = CreateDataTable();
                GridView1.DataBind();
                return;
            }
           
            NameValueCollection formCollection = Page.Request.Form;
            string[] keys = formCollection.AllKeys;
            foreach (string id in keys)
            {
                Control control = Page.FindControl(id);
                if (control is Button)
                {
                    btn = ((Button)control).ID;
                    break;
                }
            }
        }

    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>   
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onselectedindexchanged="GridView1_SelectedIndexChanged">
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="コード" />
                    <asp:BoundField DataField="Name" HeaderText="商品名" />
                    <asp:BoundField DataField="Price" HeaderText="単価" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CommandName="Select" Text="To B" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button2" runat="server" CommandName="Select" Text="To C" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>  
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>

     

     

    2008年8月6日 6:55
  •  

    回答ありがとうございます。

     

    >上記の意味がよく分かりませんが、ボタンを2つ設けておいて、一方がクリ
    >ックされたら B 画面へ、他方がクリックされたら C 画面へ飛ぶようにしたいということでしょうか?

     

    ⇒そのとおりです。

    説明が、不十分で、分かりずらい部分があると思いますが、よろしくお願いします

    GridViewタスクの列編集フィールド内にある選択した使用フィ-ルドは、以下の指定を行いました。

    B画面へは、ButtunField, C画面へは、Command FieldのSelect textを使用して、遷移先の画面を変更しようと考えています。

     

     

    >であれば、以下のような感じで実現できると思います。Page_B.aspx,
    >Page_C.aspx の例までは示してませんが、何か適当なものを作って試してみ
    >てください。

     

    開発を、VBで行っています。サンプルソースが、C言語で記述されているため、理解できない部分があります。

    できれば、VB言語で記述されたサンプルをA画面について、提供してもらえないでしょうか?

     

    どうぞ、よろしくお願いします。

    2008年8月6日 9:24
  • > できれば、VB言語で記述されたサンプルをA画面について、提供してもらえないでしょうか?

     

    今、夏休みで暇なので・・・

     

    Code Snippet

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        Dim btn As String = String.Empty
           
        Function CreateDataTable() As DataTable
            Dim dt As DataTable = New DataTable()
            Dim dr As DataRow

            dt.Columns.Add(New DataColumn("Code", GetType(Int32)))
            dt.Columns.Add(New DataColumn("Name", GetType(String)))
            dt.Columns.Add(New DataColumn("Price", GetType(Int32)))
          
            Dim i As Integer
            For i = 0 To 8
                dr = dt.NewRow()
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 123 * (i + 1)
                dt.Rows.Add(dr)
            Next i
           
            Return dt
        End Function

        Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
            Session("Code") = GridView1.SelectedRow.Cells(0).Text
            Session("Name") = GridView1.SelectedRow.Cells(1).Text
            Session("Price") = GridView1.SelectedRow.Cells(2).Text

            If btn = "Button1" Then
                Response.Redirect("Page_B.aspx")
            End If

            If btn = "Button2" Then
                Response.Redirect("Page_C.aspx")
            End If
        End Sub

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not Page.IsPostBack Then
                GridView1.DataSource = CreateDataTable()
                GridView1.DataBind()
                Return
            End If
           
            Dim formCollection As NameValueCollection = Page.Request.Form
            Dim keys As String() = formCollection.AllKeys
            For Each id As String In keys
                Dim control As Control = Page.FindControl(id)
                If TypeOf control Is Button Then
                    btn = CType(control, Button).ID
                    Exit For
                End If
            Next id
        End Sub
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onselectedindexchanged="GridView1_SelectedIndexChanged" >
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="コード" />
                    <asp:BoundField DataField="Name" HeaderText="商品名" />
                    <asp:BoundField DataField="Price" HeaderText="単価" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CommandName="Select" Text="To B" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button2" runat="server" CommandName="Select" Text="To C" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>  
            </asp:GridView>   
        </div>
        </form>
    </body>
    </html>

     

     

     

    2008年8月6日 11:16
  • 他のスレッドを見ていて思ったのですが、以下のコードの方が分かりやすく

    かつスマートなような気がします。ご参考まで。

     

    Code Snippet

    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        Function CreateDataTable() As DataTable
            Dim dt As DataTable = New DataTable()
            Dim dr As DataRow

            dt.Columns.Add(New DataColumn("Code", GetType(Int32)))
            dt.Columns.Add(New DataColumn("Name", GetType(String)))
            dt.Columns.Add(New DataColumn("Price", GetType(Int32)))
          
            Dim i As Integer
            For i = 0 To 8
                dr = dt.NewRow()
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 123 * (i + 1)
                dt.Rows.Add(dr)
            Next i
           
            Return dt
        End Function
       
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not Page.IsPostBack Then
                GridView1.DataSource = CreateDataTable()
                GridView1.DataBind()
            End If
        End Sub

        Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
            If e.Row.RowType = DataControlRowType.DataRow Then
                CType(e.Row.FindControl("Button1"), Button).CommandArgument = e.Row.RowIndex.ToString()
                CType(e.Row.FindControl("Button2"), Button).CommandArgument = e.Row.RowIndex.ToString()
            End If
        End Sub

        Protected Sub Button_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
            Dim row As GridViewRow = GridView1.Rows(Int32.Parse(e.CommandArgument))
            Session("Code") = row.Cells(0).Text
            Session("Name") = row.Cells(1).Text
            Session("Price") = row.Cells(2).Text

            If e.CommandName = "Button1" Then
                Response.Redirect("Page_B.aspx")
            End If

            If e.CommandName = "Button2" Then
                Response.Redirect("Page_C.aspx")
            End If
        End Sub
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                onrowdatabound="GridView1_RowDataBound">
                <Columns>
                    <asp:BoundField DataField="Code" HeaderText="コード" />
                    <asp:BoundField DataField="Name" HeaderText="商品名" />
                    <asp:BoundField DataField="Price" HeaderText="単価" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CommandName="Button1" Text="To B"
                                oncommand="Button_Command" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button2" runat="server" CommandName="Button2" Text="To C"
                                oncommand="Button_Command" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>  
            </asp:GridView>     
        </div>
        </form>
    </body>
    </html>

     

     

    2008年8月7日 12:11
  •    SurferOnWww

     

    回答ありがとうございます。

     

    いろいろと試行していた為、返信が遅れてしまいました。

     

    すいませんでした。

     

    回答の一部を利用して、画面遷移することが、できました。

    ありがとうございます。

     

    LinkButtonコントロールを使用し、OnCommandプロパティにて、

    を使用して、E.CommandArgumentにて、選択内容を判断して、対応しました。

     

     

     

     

    2008年8月19日 7:56