MultiRow for ASP.NETでページングを実装する
MultiRow for ASP.NETにはページングを行うためのプロパティがあります。それがAllowPagingプロパティです。AllowPagingプロパティをTrueに設定しておけばPageSizeプロパティに設定された行数ごとにページングできます。
このように設定することによりDataSourceに割り当てられたデータソースに含まれているデータ全体からカレントページの先頭位置を算出してPageSizeプロパティの行数だけを表示します。データソース全体を対象にするのでデータソース自身にはページング機能の実装などは不要です。
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を使った更新画面など、さらに詳細な使い方を応用編として紹介します。