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

質問
-
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にて開発不明点等は、問い合わせください。
回答
-
> できれば、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 DataRowdt.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 FunctionProtected 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).TextIf btn = "Button1" Then
Response.Redirect("Page_B.aspx")
End IfIf btn = "Button2" Then
Response.Redirect("Page_C.aspx")
End If
End SubProtected 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> -
他のスレッドを見ていて思ったのですが、以下のコードの方が分かりやすく
かつスマートなような気がします。ご参考まで。
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 DataRowdt.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 SubProtected 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 SubProtected 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).TextIf e.CommandName = "Button1" Then
Response.Redirect("Page_B.aspx")
End IfIf 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>
すべての返信
-
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 -
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).aspxGridView.SelectedValue プロパティ
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview.selectedvalue(VS.80).aspx -
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画面のキーの詳細情報が表示されていない状態です。
原因を調べたいのですが、指定ミスまた、定義方法誤り等について、ご指摘ください。
どうぞ、よろしくお願いします。
以上
-
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変数が、わかる方法があれば、教えてください。
よろしくお願いします。
以上
-
問題の原因ではないかもしれませんが、以下のコードが変だと思いま
すが・・・
> Dim seriesnumber1 As String = CType(GridView1.SelectedDataKey("seriesnumber"), Int32)
> Dim familynumber1 As String = CType(GridView1.SelectedDataKey("familynumber"), Int32)C# だとコンパイルエラーです。型チェックの甘い VB(C# と同様に厳しく
するオプションがあるそうですが)の場合はコンパイラは通のかもしれま
せんが。 -
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にインシデントをお持ちであれば、そこでサポートを受けられると思います。
-
早速の回答ありがとうございました。
以下の箇所を試したみました。
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しますので、よろしくお願いします。
情報が不足している部分があると、思いますので、指摘ください。
指摘箇所について、説明していきますので、対応をよろしくお願いします。
以上
-
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でした。この記述で大丈夫です。
ところでこの行で右クリックして、ブレークポイントの挿入はできるのでしょうか? -
tanuyoshi さんからの引用 ⇒ブレークポイントの挿入ができました。
デバッグ開始で起動してみましたが、画面遷移時の情報がわかりませんでした。
ブレークポイントは赤丸でしょうか? また、GridViewの行を選択した際に、ブレークポイントで停止しましたか?
停止しない場合は、以下が当てはまるかもしれません。
[PRB] ASP.NET ページのデバッグ時に Visual Studio .NET デバッガがブレークポイントで停止しない
http://support.microsoft.com/kb/306169/jaweb.config debug=true にしてもブレークポイントに止まらない
http://dobon.net/vb/bbs/log3-33/20296.htmlVisual Studio2005でASP.NETのWebサイトのブレークポイントが停止しない件(Vista編)
http://blog.kansai.com/inspirace48/259 -
早速の回答ありがとうございます。
返信が遅れてすいません。ご指摘の部分を確認しましたので、回答します。
ブレークポイントは赤丸でしょうか? また、GridViewの行を選択した際に、ブレークポイントで停止しましたか?
停止しない場合は、以下が当てはまるかもしれません。
1)ブレクポイントは赤丸です。
2)ブレークポイントで停止しませんでした。(原因不明)
画面は、遷移した
停止しない場合のパターンを調査中です。わかり次第回答します。
デバッグ方法はこのまま調査しますが、 最初のQAのSession情報取得がうまく取得できない状態を解決する方法で、何かよい手段がわかれば教えてください。
A画面と遷移先B画面の設定方法について、ソースを再度、確認したいと思います。
内容確認で、参考Jとなる事例集等ありましたら、教えてください。
どうぞ、よろしくお願いします。
以上
-
ブレークポイントで止まらないなどデバッグ環境がうまく動いていないとなれば、先に紹介したResponse.WriteとResponse.Endを使ってデバッグする方法があります。とりあえず以下のようにした場合、セッション変数の値が表示されますか?
このようにして、どこまで動いてどこから動かなくなるのかを、まず見つけた方が良いでしょう。Code SnippetProtected 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 ") = familynumber1Response.Write(Session("syouhin.aspx.productcd") )
Response.End()
End Sub -
trapemiya 様へ
早速の回答ありがとうございます。
・指摘のとおり、修正しましたが、セッション変数の値が表示されない状態です。
遷移方法が、間違っていると思われますので、確認したいので、教えてください。
GridViewの列編集で、buttomFieldとHyperLinkFieldを使用して、画面遷移先urlを指定しています。
LinkButtomのPostBackurlに遷移先を指定すると、セッション変数の値が使用できるのでしょうか?
GridViiewの使用方法が間違っているのでしょうか?
確認です。
どうぞ、よろしくお願いします。
以上
-
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が正しく設定されているか確認してみて下さい。
-
-
早速の回答ありがとうございました。
指摘のとおり、実施し、画面遷移できました。
ありがとうございます。
>GridView1_SelectedIndexChanged メソッドの一番最後に、
>Response.Redirect("xxx.aspx")
>としてやればうまく行きそうな気がしますけど。
また、以下の指摘事項について回答します。
>意味不明ですが、次の画面に飛ぶ前に Session("xxxx") が設定されていますか?
Session("xxxx") を設定しいます。
>#全角、半角はきちんと区別して使いましょう。引用は > を使いましょう。
指摘のとおり、区別できるように、記述します。
A画面→B画面に遷移できました。
今度は、A画面→C画面に遷移できるようにしたいのですが、選択された行からは、
GridView1_SelectedIndexChangedに遷移している選択列がわからないため、今は、B画面に無条件で遷移するようになっています。
C画面に遷移できるように、判定をしたいのですが、判定方法の参考例を教えてください。
よろしくお願いします。
以上
-
> 今度は、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> -
回答ありがとうございます。
>上記の意味がよく分かりませんが、ボタンを2つ設けておいて、一方がクリ
>ックされたら B 画面へ、他方がクリックされたら C 画面へ飛ぶようにしたいということでしょうか?⇒そのとおりです。
説明が、不十分で、分かりずらい部分があると思いますが、よろしくお願いします
GridViewタスクの列編集フィールド内にある選択した使用フィ-ルドは、以下の指定を行いました。
B画面へは、ButtunField, C画面へは、Command FieldのSelect textを使用して、遷移先の画面を変更しようと考えています。
>であれば、以下のような感じで実現できると思います。Page_B.aspx,
>Page_C.aspx の例までは示してませんが、何か適当なものを作って試してみ
>てください。開発を、VBで行っています。サンプルソースが、C言語で記述されているため、理解できない部分があります。
できれば、VB言語で記述されたサンプルをA画面について、提供してもらえないでしょうか?
どうぞ、よろしくお願いします。
-
> できれば、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 DataRowdt.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 FunctionProtected 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).TextIf btn = "Button1" Then
Response.Redirect("Page_B.aspx")
End IfIf btn = "Button2" Then
Response.Redirect("Page_C.aspx")
End If
End SubProtected 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> -
他のスレッドを見ていて思ったのですが、以下のコードの方が分かりやすく
かつスマートなような気がします。ご参考まで。
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 DataRowdt.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 SubProtected 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 SubProtected 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).TextIf e.CommandName = "Button1" Then
Response.Redirect("Page_B.aspx")
End IfIf 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> -
回答ありがとうございます。
いろいろと試行していた為、返信が遅れてしまいました。
すいませんでした。
回答の一部を利用して、画面遷移することが、できました。
ありがとうございます。
LinkButtonコントロールを使用し、OnCommandプロパティにて、
を使用して、E.CommandArgumentにて、選択内容を判断して、対応しました。