MultiRow for ASP.NETでページングを実装する
MultiRow for ASP.NETにはページングを行うためのプロパティがあります。それがAllowPagingプロパティです。AllowPagingプロパティをTrueに設定しておけばPageSizeプロパティに設定された行数ごとにページングできます。
このように設定することによりDataSourceに割り当てられたデータソースに含まれているデータ全体からカレントページの先頭位置を算出してPageSizeプロパティの行数だけを表示します。データソース全体を対象にするのでデータソース自身にはページング機能の実装などは不要です。
![図9 [ページングを有効にする]にチェックを入れる、デフォルトの設定は1ページ10行表示](http://cz-cdn.shoeisha.jp/static/images/article/5351/12.gif)
MultiRow for ASP.NETでObjectDataSourceのページングを利用する
取り扱うデータが膨大でパフォーマンスが気になる場合は、少し手間がかかりますが、ObjectDataSourceのページング機能を併用することで、高パフォーマンスなページの作成が可能です(サンプルソース「CZ1007PagerSample」)。

今回、データベースからの値の入出力は、すべて「CZ1007Bound」クラスで実装しています。そこで、ObjectDataSourceを介してページングに必要な動作を行うメソッドを「CZ1007Bound」クラスに追加し、ページング機能付きMultiRowを実現してみましょう。
ページング機能付きデータアクセスクラス
「CZ1007Bound」クラスにページング機能を実装するためには、いくつかの約束事を守ったメソッドを実装しなければなりません。
必要なメソッドは「レコード数を取得する」メソッドと、「先頭から数えてn個目からm個のレコードを取得する」メソッドの2つです。この2つのメソッドのパラメタは、同一にしなければなりません。
今回のサンプルでは、「レコード数を取得する」メソッドとしてGetNumberOfOrdersメソッドを実装します。本来は先頭3つのパラメタだけで十分ですが、ObjectDataSourceで使われることを前提として、startRowIndexとmaximumRowsパラメタが追加されています。
Public Function GetNumberOfOrders(ByVal userID As String,
ByVal password As String,
ByVal billNo As String,
ByVal startRowIndex As Integer,
ByVal maximumRows As Integer) As Integer
Dim rows As Integer = 0
Using _cn As New OleDb.OleDbConnection()
_cn.ConnectionString = String.Format(System.Configuration.ConfigurationManager.AppSettings("ConnectionString"),
userID,
password)
_cn.Open()
Using _cmd As New OleDb.OleDbCommand
_cmd.Connection = _cn
_cmd.CommandText =
"SELECT COUNT(*) " &
"FROM Customers " &
"INNER JOIN (Bill INNER JOIN BillCondition " &
"ON Bill.BillNo = BillCondition.BillNo)" &
"ON Customers.CustomerID = Bill.CustomerID " &
"WHERE Bill.BillNo=? "
_cmd.Parameters.AddWithValue("@billNo", billNo)
rows = CType(_cmd.ExecuteScalar, Integer)
End Using
_cn.Close()
End Using
Return rows
End Function
「先頭から数えてn個目からm個のレコードを取得する」メソッドとしては、GetRecordsByIndexメソッドを実装します。nとmは、それぞれstartRowIndexとmaximumRowsというパラメタ値として、このメソッドに渡ってきます。
Public Function GetRecordsByIndex(ByVal userID As String,
ByVal password As String,
ByVal billNo As String,
ByVal startRowIndex As Integer,
ByVal maximumRows As Integer) As DataSet
Dim ds As New DataSet
Using _cn As New OleDb.OleDbConnection()
:
(中略)
:
End Using
Return ds
End Function
ページング機能付きデータアクセスクラスをObjectDataSourceで利用
「CZ1007Bound」クラスをObjectDataSourceで利用するために、設定が必要なメソッドとしては次のものがあります。
| プロパティ | 用途 | 設定値 |
|---|---|---|
| TypeName | クラス名を指定 | CZ1007Bound |
| SelectMethod | レコード取得用メソッド名 | GetRecordsByIndex |
| SelectCountMethod | 件数取得用メソッド名 | GetNumberOfOrders |
| EnablePaging | True:ページング | True |
ObjectDataSourceに対してページング機能を有効(EnablePaging=True)にすると、StartRowIndexParameterNameメソッドとMaximumRowsParameterNameメソッドの設定値も有効になります。
StartRowIndexParameterNameメソッドは、カレントページの先頭に表示する行位置を「CZ1007Bound」クラスに渡すためのパラメタ名で、デフォルト値として「startRowIndex」が指定されています。
MaximumRowsParameterNameメソッドは、ページ内の行数を「CZ1007Bound」クラスに渡すためのパラメタ名で、デフォルト値として「maximumRows」が指定されています。
ここで指定したパラメタ名をSelect時に使うためのは、パラメータコレクションエディターを使います。

このように設定しておけば、リスト3に相当するコードを記述しなくても、「CZ1007Bound」クラスのメソッドが自動的に呼び出されてデータを取得します。そのため「aspx.vb」ファイルの内容は、リスト6のように初期状態のままになっています。
Partial Class MultiRowSample
Inherits System.Web.UI.Page
End Class
実行
フッタのページ数をクリックすれば、該当ページに移動もできます。クリックするたびにパラメタにも適切な値が設定されて、「CZ1007Bound」クラスのGetRecordsByIndexメソッドが自動的に呼び出されます。
次回予告
今回は参照画面について、Repeaterコントロールよりも簡単な使い方を紹介しました。次回は、MultiRowを使った更新画面など、さらに詳細な使い方を応用編として紹介します。


