解説

実例で学ぶASP.NETプログラミング
―― ショッピング・サイト構築で学ぶASP.NET実践講座――

第7回 一覧ページを作る―DataGridコントロールに対するコーディング―

小田原 貴樹(うりゅう)
2003/06/24

Back Issue
1
ASP.NETの観点からショッピング・サイトを定義する
2 トップ・ページ構築で理解するASP.NETの特長
3 「実プロ流」ASP.NETデータベース操作術
4 DB連携ページをASP.NETで構築する(前編)
5 DB連携ページをASP.NETで構築する(後編)
6 ASP.NETの真骨頂-DataGridコントロールで一覧ページを制する

 前回の連載第6回では、DataGridコントロールを使った商品一覧ページのレイアウトについて解説した。これで外観は完成したわけだが、肝心な各種機能の実装にまではいたらなかった。今回はDataGridコントロールでさまざまな機能を実現するコードの書き方を紹介しよう。ぜひとも前回の記事と合わせて読んでいただきたい。

DataGridコントロールに対するコーディング

 ASP.NETのDataGridコントロールに対するプログラミングは、機能によってかなり定型化されており、一度記述してしまえば、ちょっとしたアレンジでほかのシステムなどでも利用することができる。ここからは機能(イベント)別に、そのコードと必要になる設定作業を解説していく。

■共有変数の宣言とインスタンスの作成

 まずは、前回でDataGridコントロールを配置したWebフォームのコードビハインド・ファイルを開き、次のコードをフィールド宣言部分のすぐ下に記述する。

Public DC As New DATACON()
Public Shared SOEX As String
Public Shared ADCNT As String
コードビハインド・ファイルに追加するコード

 1行目は連載でもおなじみの、データベースから情報を取得・更新するためのクラスである「DATACON」のインスタンスを、「DC」という名前で新しく生成するための処理である。これでこのクラスの中でもDATACONクラスのメソッドが利用できるようになる。

 2行目、3行目の宣言では「Shared」修飾子を利用して、共有変数を宣言している。一般的にASP.NETは、Webというプラットフォームで動作する関係上、各変数はページが遷移するたびに初期化される。ページを移動する場合にはそれでも構わないのだが、何かしらの機能を提供するために、ポストバックによりページがリロードされるたびに変数の中身がクリアされたのでは不都合なことも多い。その問題をクリアするための解決方法のひとつが、共有変数を利用することだ。共有変数であれば、ポストバックが起きても値が保持されるため、ページ全体の動作を通して保存しておきたい情報を格納するのに役立つ。

 2行目で宣言しているのが「一覧表の並び替え条件」を保持するための変数、3行目で保存しているのが「一覧表の並び替え順」を保持しておくための変数となっている。

■変数の初期化とDataGridコントロールの表示

 商品一覧ページが開かれたときに自動的に実行されるイベント・ハンドラ「Page_Load」の中では、変数の初期化と、DataGridコントロールの表示を行うためのコーディングが必要になる。

1: Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:   If Not IsPostBack Then
3:     SOEX = "銘柄,容量"
4:     ADCNT = " ASC"
5:     CNTL.Text = GVIEW()
6:   End If
7: End Sub
初期化&表示のためのコード(イベント:Page.Load)

 2行目の「If Not IsPostBack Then」という構文は、ASP.NETでサイトを構築する際に非常に重要な役割を持つ構文だ。この構文の詳細については後で詳しく説明するが、この構文は「このイベント発生したのがページのポストバックによるものでなければ」という意味になる。ざっくりと理解するならば、「他のページからジャンプしてきたときだけ実行する」制御文になっていると考えていただきたい。

 3行目は先ほど宣言した「一覧表の並び替え条件」を格納する変数に、商品一覧ページが開かれたときの最初の並び替え条件を指定している。

 4行目も同様に、先ほど宣言した「一覧表の並び替え順」を格納する変数に、商品一覧ページが開かれたときの最初の並び替え順として「昇順」を指定している。この指定に関しては、SQL文のORDER BY句の文法に従っているので、よく分からなければそちらを参照してほしい。

 並び替えに関する変数に初期表示の条件を格納した上で、5行目でDataGridコントロール内にデータを格納・表示し、現在表示している一覧が商品情報全体のどの部分に当たるかを画面上部に配置したテキスト・ボックスに文章として格納している。

 この部分はGVIEWという名前で作成したメソッドで処理している。メソッド化している理由は、DataGridコントロールを表示するために必要なコード群が完全に定型文であり、各機能を実行するたびに呼び出す必要があるからだ。実際に、今回紹介するサンプルではこのメソッドを何度も使っている。それでは、このメソッド内のコードを確認してみよう。

 1: Private Function GVIEW() As String
 2:   DC.FDPLV(Plvset1)
 3:   PLVVIEW1.Sort = SOEX
 4:
 5:   PGRID.DataBind()
 6:
 7:   Dim ALLCNT As Integer = PLVVIEW1.Count
 8:   Dim STCNT As Integer = (PGRID.CurrentPageIndex * 10) + 1
 9:   Dim EDCNT As Integer = ((PGRID.CurrentPageIndex + 1) * 10)
10:   If ALLCNT < EDCNT Then
11:     EDCNT = ALLCNT
12:   End If
13:   Dim CNTMES As String = ALLCNT & "件中、" & STCNT & "〜" & EDCNT & "件を表示"
14:   Return CNTMES
15: End Function
DataGridコントロールに情報を格納し、表示を行うメソッドGVIEWのコード

 それほど複雑な構文のない、あっさりしたコードなので上から順にサッと流して内容を把握してほしい。

 まず、2行目ではDataGridコントロールの大元のデータ・ソースである「Plvset1」に、対応するDataAdapterオブジェクトのFillメソッドを実行しデータを格納するメソッドを実行している。このオリジナルのメソッドに関しては、連載第3回のデータを取得・更新するメソッドの作成項を参照してもらえば、すぐ理解してもらえるはずだ。

 DataGridコントロールの実際のデータ・ソース、「PLVVIEW1」という名前で作成したDataViewコントロールには、2行目が実行された段階で、データが格納されている。その上で3行目では、DataViewコントロールの「Sort」プロパティに対して、「一覧表の並び替え条件」を格納している共有変数SOEXを割り当て、データの並べ替えを指示している。

 例えば、このメソッドがPage_Loadメソッドから呼ばれたとすると、Sortプロパティには“銘柄,容量”という割り当てが行われるので、一覧表に表示されるデータの並びは、銘柄(商品名)の昇順で並べられ、さらに容量(商品サイズ)の昇順で並べられた状態となる。

 共有変数は同じページ内(ページ・クラス内)では常に1つの値だけを保持しているので、どのメソッドからでも直接指定ができる。便利な反面、動作の流れに沿っていないと思いもかけないエラーを誘発しやすいので注意が必要となる。例えば、共有変数はアプリケーション全体で値を共有するため、複数のユーザーがページを参照している場合、自分の操作によって格納された値が、他者の操作によって上書きされてしまい挙動がおかしくなるケーるが考えられる。

 そういったケースが想定される場合には共有変数ではなく、セッション変数を利用するべきだろう。セッション変数であれば、ユーザーごとでの格納となるので、こういった問題は起こらない。

 5行目に注目していただきたい。DataGridコントロールのDataBindメソッドを実行しているだけなのだが、ASP.NETのDataGridコントロールでは、このDataBindメソッドが実行されない限り、ページ上に一覧表が生成されない。

 極めて単純なルールだが、デザイナ画面上ではレイアウト設定段階で実際のデータが格納されているかのような一覧表がプレビューできるために忘れてしまいやすい。このルールを忘れてしまった場合、デザイナ画面には一覧表があるのに、実行すると何も表示されないというパニック一歩手前の動作が起きてしまう。よく覚えておいていただきたい。

 7行目以降は表示対象の全データ件数のうち、一覧表として表示されているデータがどの位置にあたるものかということをメッセージ化するためのコードだ。簡単なコードなので細かくは説明しない。

 8行目と9行目にある「PGRID.CurrentPageIndex」というプロパティは初めて目にするものだ。これはDataGridコントロールが現在表示している「ページの番号」を格納している。DataGridコントロールにはページングの機能が標準で用意されているため、一定の件数ごと(ここでは10件ごと)にページを切り替えてデータを表示することができる。現在表示されているページ番号に1ページあたりの件数を掛けてやれば、表示されているレコードの番号を割り出すことは容易だ。

 そうして割り出した情報を、13行目で文字列に埋め込み、14行目ではこの文字列を返り値として呼び出し元へ返してこのメソッドは終了する。

 Page_Loadイベントから通してコードを確認してきた。これでページが呼び出されたときにDataGridコントロールで一覧表を表示するところまでは完成した。ここまでの作業で実際に動作を試してみるのもいいかもしれない。コーディング・ミスがなければ、商品一覧の最初の1ページ目が表示されているはずだ。

 それでは、このDataGridコントロールに各種の機能を割り当て、本格的に動作する商品一覧ページを構築していこう。


 INDEX
  実例で学ぶASP.NETプログラミング
  第7回 一覧ページを作る―DataGridコントロールに対するコーディング―
  1.共有変数の宣言とインスタンスの作成
    2.DataGridコントロールにページング機能を実装する
    3.DataGridコントロールに列項目ごとの並べ替え機能を実装する
    4.ユーザーが選んだ商品の写真を表示する機能を実装する
    5.DataGridコントロールでトラブルを防ぐ3つの標語
 
インデックス・ページヘ  「解説 :実例で学ぶ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 記事ランキング

本日 月間