解説

実例で学ぶASP.NETプログラミング

第8回 ASP.NETで実現する「見栄えの良い」商品紹介ページ−前編

小田原 貴樹(うりゅう)
2003/07/19

■ユーザーが左メニューを選択した場合の処理を実装する

 さて、これであとは配置してあるイメージ・ボタンをクリックした際のイベントを記述すれば、ユーザーの操作を受け取ることができる。デザイナ画面上でイメージ・ボタンをダブルクリックし、追加されたClickイベントにコード・エディタで以下の1行を追加してほしい。

Private Sub ImageButton1_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.Click

  Server.Transfer("PLIST.ASPX?ID=1")

End Sub
先頭のイメージ・ボタンのClickイベントに追加するコード
実際に追加するのは「Server.Transfer("PLIST.ASPX?ID=1")」の1行

 ASP.NETのコードでページ間移動を行いたい場合には、Server.TransferメソッドかResponse.Redirectメソッドを利用するのが一般的だ。これらの間には、サーバの動作制御上いろいろな差異があるが、利用する上で意識する必要はそれほどないだろう。どちらかというとServer.Transferメソッドを利用することが推奨されているようだ。

 メソッド内に移動先のURLを記述するのだが、ここに前回作成した一覧ページのファイル名を指定しただけでは、全商品の一覧が表示されてしまう。ユーザーが指定したカテゴリで一覧を反映させるために、「フォーム間の値渡し」を行う必要がある。

 フォーム間の値渡しに関する詳細は後述するが、ここでは「クエリ文字列」を利用して値渡しを行っている。これはいわゆる「GETメソッド」を使用し、明示的にクエリ文字列をURLに付加して指定する方法で、ASP.NETの値渡しの中では最も単純な方法だろう。

 値渡しにIDという変数を利用し、その値として各カテゴリの主キーであるID値を渡している。このID値はデータベース内の「酒カテゴリ」テーブルの中に格納されているものだが、ここでは深く考えず、上記コードにしたがって残りのボタンにも1から順に割り当ててもらえばよい。一番下のイメージ・ボタンまで記述が終わると、14までIDが割り振られているはずだ。これで、メニュー側の準備は完了した。

■全商品一覧ページをカテゴリ別一覧としても利用する

 さて、これでページを移動し、その遷移先のフォームに値を渡すところまでは実装できた。あとは、その値によって全商品一覧ページに表示するデータを変更するようにコードを追加すればよい。

 全商品一覧ページであるPLIST.ASPXをコード・エディタで開き、Page_Loadイベント内のコードを次のように変更する。

 1: If Not IsPostBack Then
 2:
 3:   If Request.QueryString("ID") > 0 Then
 4:     Session("CID") = Request.QueryString("ID")
 5:   Else
 6:     Session("CID") = 0
 7:   End If
 8:
 9:   SOEX = "銘柄,容量"
10:   ADCNT = " ASC"
11:
12:   CNTL.Text = GVIEW(Session("CID"))
13:
14: End If
変更したPage_Loadイベントのコード

 3行目〜7行目に追加したコードが、左メニューから受け渡される値を取得している部分だ。ASP.NETでは「GETメソッド」で渡される値については、主にRequest.QueryStringを用いて取得する。

 3行目では、そのRequest.QueryStringで取得したIDという値の中に、カテゴリのIDが入っているかどうかを判定している。これによってカテゴリ別商品一覧としてページが開かれているか、全商品一覧としてページが開かれているのかを判断している。

 その判断に応じて、カテゴリ別商品として開かれているならば、4行目でセッション変数CIDの中に渡された値を格納し、全商品一覧として開かれているならば6行目で0を格納するようにしている。

 セッション変数に関してはこの連載では初めて扱ったが、要は「サイトにアクセスしているユーザーごとに内容が異なる、共通の名前の変数」だと思っていただきたい。セッション変数はサイトが格納されているサーバのメモリ空間を利用するのが標準だ。セッション変数は宣言が不要で、サイト全体を通じて利用することが可能ため便利だが、その反面、多用すると混乱を引き起こしやすいので注意が必要となる。セッション変数に関しては次回で詳細に解説する予定だ。

 12行目で呼び出しているGVIEWという前回作成した一覧表時用のメソッドには、もともと引数がなかった。しかし、そのままではカテゴリ別商品一覧が実現できないので、先ほど値を格納したセッション変数CIDを引数に指定できるようにGVIEWメソッドを修正しよう。

 1: Private Function GVIEW(ByVal CID As Integer) As String
 2:
 3:   DC.FDPLV(Plvset1)
 4:
 5:   If Not CID = 0 Then
 6:     PLVVIEW1.RowFilter = "酒種ID = " & CID
 7:   End If
 8:
 9:   PLVVIEW1.Sort = SOEX
10:
11:   PGRID.DataBind()
12:
13:   Dim ALLCNT As Integer = PLVVIEW1.Count
14:   Dim STCNT As Integer = (PGRID.CurrentPageIndex * 10) + 1
15:   Dim EDCNT As Integer = ((PGRID.CurrentPageIndex + 1) * 10)
16:
17:   If ALLCNT < EDCNT Then
18:     EDCNT = ALLCNT
19:   End If
20:
21:   Dim CNTMES As String = ALLCNT & "件中、" & STCNT & "〜" & EDCNT & "件を表示"
22:   Return CNTMES
23:
24: End Function
修正したGVIEWメソッド

 GVIEWメソッドで修正しなければならないのは、まず1行目の宣言部だ。先ほど新しく受け渡すことにしたカテゴリのIDをCIDという名前で受け取るようにする。

 さらに、5行目〜7行目に、カテゴリ別商品一覧を実現するためのコードを追加している。受け取ったCIDが0、すなわち全商品一覧の指定になっているとき以外は、商品一覧用のデータが格納されているDataViewオブジェクト「PLVVIEW1」のRowFilterプロパティに値を設定している。

 DataViewオブジェクトのRowFilterプロパティに設定する値は、SQL文おける「WHERE句」がそのまま利用できる。RowFilterプロパティを設定するたびにDataViewオブジェクトに格納されたデータにフィルタを適用することができ大変便利な機能だ。

 「商品一覧ビュー」の「酒種ID」列に対して、受け取ったCIDの値をフィルタとして指定しているのが、6行目だ。これで、全商品が格納されていた「PLVVIEW1」にカテゴリIDの値によるフィルタがかかり、ユーザーが選んだカテゴリの商品だけが一覧ページ内に表示できるようになった。

 PLIST.ASPX.VBのコードの中では、ほかにPGRID_PageIndexChangedイベントと、PGRID_SortCommandイベントの中で、GVIEWメソッドを呼び出しているので、これらでも同様に「Session("CID")」を引数として指定する必要がある。そこまで行えば修正は完了だ。これで全商品一覧ページだったPLIST.ASPXが、左フレーム・メニューでのユーザー選択に応じて、選ばれたカテゴリの商品一覧を生成できるようになった。


 INDEX
  実例で学ぶASP.NETプログラミング
  第8回 ASP.NETで実現する「見栄えの良い」商品紹介ページ−前編
    1.商品カテゴリ別一覧ページ作成の補足説明
  2.ユーザーが左メニューを選択した場合の処理を実装する
    3.「フレーム間の制御」と「ページ間の値渡し」
    4.商品紹介ページ上部のデザインを作成する
    5.一覧表ページと連結させて表示をテストする
 
インデックス・ページヘ  「解説 :実例で学ぶASP.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間