DataGridにページング機能を追加したサンプル

図 DataGridにページング機能を追加したサンプル
このサンプルは、DataGridに表示されているレコードをページングすることができます。DataGridのページを移動するには、ページ番号を選択する方法と移動ボタンをクリックする方法があります。ページ番号を選択して移動するときは、DropDownListから目的のページ番号を選択します。移動ボタンには、
、
、
、
の4種類あります。
ボタンをクリックすると、先頭ページを表示します。
ボタンをクリックすると、前ページに移動します。
ボタンをクリックすると、次ページに移動します。
ボタンをクリックすると、最終ページに移動します。
先頭ページが表示されているときは、
と
のボタンが使用不可になります。最終ページが表示されているときは、
と
のボタンが使用不可になります。
DataGridから得意先を選択すると、右側のRepeaterに得意先の詳細が表示されます。
◆プログラムDataGridPaging.aspxのポイント
¶ポイント1 ページ番号とページ移動ボタンの両方を利用できるようにするには
Web Matrixのテンプレートを使用すれば、DataGridにページング機能を簡単に追加することができます。Web Matrixのテンプレートは、DataGridのページング機能を利用して実現しています。DataGridのページング機能は、ページ番号と移動ボタンのどちらかしか利用できません。DataGridのページ番号による移動では、すべてのページ番号を表示することができませんので、1回のクリックで目的のページに移動できません。移動ボタンでページを移動するときは、前ページと次ページの2種類のボタンしかサポートしていません。
このサンプルでは、ページ番号と移動ボタンの両方を同時に利用することができます。ページ番号で移動するときは、DropDownListにすべてのページ番号が表示されますので任意のページに1回のクリックで移動できます。移動ボタンでページを移動するときは、先頭ページ、前ページ、次ページ、最終ページの4種類のボタンを使用することができます。
¶ポイント2 ページ番号でページを移動するには
ページ番号を指定してページを移動するには、DataGridのCurrentPageIndexプロパティに目的のページ番号を設定してDataBind()メソッドを実行します。CurrentPageIndexに設定するページ番号は、0から開始しますので注意してください。たとえば、2ページ目に移動するときは、1を設定します。
dgrdCustomers.CurrentPageIndex = PageNumber - 1
¶ポイント3 ページ移動ボタンで先頭ページ、最終ページに移動するには
ページ移動ボタンでDataGridの先頭ページに移動するには、DataGridのCurrentPageIndexプロパティに0を設定してDataBind()メソッドを実行します。採集ページに移動するときは、CurrentPageIndexにDataGridのPageCountプロパティに格納されている総ページ数から-1した値を設定します。
dgrdCustomers.CurrentPageIndex = 0 (先頭ページに移動)
dgrdCustomers.CurrentPageIndex = dgrdCustomers.PageCount - 1 (最終ページに移動)
◆プログラムDataGridPaging.aspxの解説(HTML編)
DataGridPaging.aspxのプレゼンテーションコンテンツの部分について解説します。行171-218の<table>…</table>では、ページ移動用のWebコントロールを定義しています。行174-185のImageButtonでは、先頭ページと前ページのボタンを定義しています。行186-196では、DropDownList、Label、TextBoxを定義してページ番号を表示しています。DropDownListには、AutoPostBackプロパティにTrueを設定して、ページ番号を選択したときにWebページがポストバックされるようにしています。TextBoxのReadOnlyプロパティには、Trueを設定して読み込み専用にしています。行197-208のImageButtonでは、次ページと最終ページのボタンを定義しています。行209-215では、LabelとTextBoxで件数を表示しています。
ここで定義しているページ移動用のImageButonは、OnCommandイベントを共有しています。OnCommandイベントで、どのボタンがクリックされたか認識するために、CommandNameプロパティにfirst、prev、next、lastを設定しています。OnCommandイベントは、ImageButtonをクリックしたときに発生します。
![]()
図 ページ移動用のWebコントロール
行228-267では、DataGridを定義しています。行229では、AutoGenerateColumnsプロパティにFalseを設定してカラムの自動生成機能を抑止しています。行233では、AllowPagingプロパティにTrueを設定してページング機能を有効にしています。行234では、PageSizeプロパティに10を設定して1ページに10行表示されるようにしています。
行246-266の<Columns>…</Columns>では、TemplateColumnとBoundColumnを定義しています。TemplateColumnでは、ItemTemplateにLinkButtonを定義しています。LinkButtonは、レコードセレクターとして使用します。BoundColumnでは、得意先テーブルの得意先名と都道府県をバインドしています。

図 DataGridに得意先テーブルを表示した例
行271-308では、Repeaterを定義しています。Repeaterには、得意先の詳細を表示します。行272-307の<ItemTemplate>…</ItemTemplate>では、得意先テーブルの得意先ID、得意先名、部署役職、電話番号、ファクスをバインドして表示しています。行276-303の<fieldset>…</fieldset>では、角が丸みのあるボックスを定義しています。行278-281の<tr>…</tr>では、得意先IDをバインドしています。得意先テーブルのフィールドをバインドするには、データ連結タグ<%#....%>を使用して記述します。後続する、<tr>…</tr>では、得意先名、部署役職、電話番号、ファックスをバインドしています。

図 Repeaterに得意先の詳細を表示した例
リスト DataGridPaging.aspxのソースコード(HTML編)
|
155: <html> 186: <asp:DropDownList id="dropPages"
runat="server" 197: <asp:ImageButton id="ibtnNext"
runat="server" 246: <Columns> 302:
</table> |
◆プログラムDataGridPaging.aspxの解説(コード編)
DataGridPaging.aspxは、DataGridのページング機能をカスタマイズして使い勝手を改善しています。ページ移動ボタンをクリックしたときは、ImageButtonのOnCommandイベントでDataGridのCurrentPageIndexプロパティを書き換えてページを移動します。DropDownListからページ番号を選択したときは、OnSelectedIndexChangedイベントでCurrentPageIndexにページ番号を設定して目的のページに移動します。
Sub Page_Load()イベントの処理
このイベントは、DataGridPaging.aspxがロードされたときに実行されます。このイベントでは、DataGridに得意先テーブルをバインドします。
行7-10のIf…End Ifでは、ページが最初にロードされたか調べています。ページが最初にロードされたときは、BindDataGrid()を呼び出して、DataGridに得意先テーブルをバインドします。このサンプルでは、DataGridのページング機能を使用しませんので、DataGridのPagerStyleのVisibleプロパティにFalseを設定します。この場合、DataGridにページ移動用の行(Pager)が表示されません。
|
6: Sub Page_Load() |
Sub dgrdCustomers_ItemDataBound()イベントの処理
このイベントは、DataGridのDataBind()メソッドが実行されたときに発生します。このイベントでは、DataGridのアイテム(DataGridItem)にクライアント側で動作するonClickイベントを登録しています。これにより、DataGridの任意のセルをクリックして行を選択できるようになります。
|
17: Sub
dgrdCustomers_ItemDataBound(s As Object, e As DataGridItemEventArgs) |
Sub dgrdCustomers_ItemCommand()イベントの処理
このイベントは、DataGridから行をクリックしたときに発生します。このイベントでは、DataGridから選択した得意先の詳細をRepeaterに表示します。
行31では、DataGridのDataKeysコレクションから、選択した行の主キー(得意先ID)を取得しています。行32では、BindRepeater()を呼び出してRepeaterに得意先の詳細を表示します。BindRepeaterの引数には、得意先IDを指定します。
|
29: Sub
dgrdCustomers_ItemCommand(s As Object, e As DataGridCommandEventArgs) |
Sub dgrdCustomers_PageIndexChanged()イベントの処理
このイベントは、DataGridのページ移動行(Pager)からページ番号、ページ移動ボタンをクリックしたときに発生します。このイベントではDataGridに、ページ移動行から選択したページを表示します。このサンプルでは、DataGridのページ移動行(Pager)を非可視状態にしていますので、このイベントは発生しません。
dgrdCustomers.PagerStyle.Visible = False
|
61: Sub
dgrdCustomers_PageIndexChanged(s As Object, e As
DataGridPageChangedEventArgs) |
Sub ibtnCustomPaging_Command()イベントの処理
このイベントは、DataGridの上に表示されているページ移動ボタンをクリックしたときに発生します。このイベントでは、どのボタンがクリックされたか調べてボタンに対応したページを表示します。
行37では、ImageButtonのCommadNameプロパティに設定されている値を取得しています。CommandNameプロパティには、first、prev、next、lastが格納されています。
行38-51のSelect…End Selectでは、CommandNameの値に対応してDataGridのCurrentPageIndexプロパティを書き換えます。先頭ページのボタンをクリックしたときは、CurrentPageIndexに0を設定します。前ページのボタンをクリックしたときは、CurrentPageIndexを-1します。ただし、CurrentPageIndexが0のときは書き換えません。次ページのボタンをクリックしたときは、CurrentPageIndexを+1します。ただし、CurrentPageIndexが最終ページのときは書き換えません。最終ページのボタンをクリックしたときは、CurrentPageIndexに最終ページ番号を設定します。
行52では、BindDataGrid()を呼び出してCurrentPageIndexに設定されているページを表示します。
|
36: Sub
ibtnCustomPaging_Command(s As Object, e As CommandEventArgs) |
Sub dropPages_SelectedIndexChanged()イベントの処理
このイベントは、DropDownListからページ番号を選択したときに発生します。このイベントでは、DropDownListから選択したページ番号をDataGridのCurrentPageIndexプロパティに設定してページを移動します。
行56では、DropDownListのSelectedItem.Textプロパティから、選択したページ番号を取得しています。行57では、取得したページ番号をCurrentPageIndexに設定しています。CurrentPageIndexのページ番号は、0から始まりますのでDropDownListから取得したページ番号を-1しています。行58では、BindDataGrid()を呼び出してCurrentPageIndexに設定されているページを表示します。
|
55: Sub
dropPages_SelectedIndexChanged(s As Object, e As EventArgs) |
Sub BindDataGrid()の処理
このサブプロシージャでは、DataGridに得意先テーブルをバインドして表示します。BindDataGridは、Page_Load、dropPages_SelectedIndexChanged、ibtnCustomPaging_Commandイベントから呼ばれます。
行67では、得意先テーブルからレコードを抽出するSQLを生成しています。行68では、CreateDataSet()関数を呼び出して得意先テーブルのDataSetを作成しています。
行69-74のWith…End Withでは、DataGridに得意先テーブルのDataViewをバインドしています。行70では、DataGridのDataSourceプロパティに得意先テーブルのDataViewを設定しています。行71では、DataKeyFieldプロパティに得意先テーブルの主キーのカラム(得意先ID)を設定しています。行72では、DataBind()メソッドでDataViewをバインドしています。行73では、SelectedIndexプロパティに-1を設定して以前に選択された行を解除しています。
行76-79のWith…End Withでは、RepeaterのDataSourceプロパティにNothingを設定して初期化しています。
行81-85のWith…End Withでは、DropDownListにページ番号(1から最終ページまで)をバインドして表示します。DropDownListのDataSourceプロパティには、CreatePageArray()関数で作成したArrayListを設定してバインドします。行84では、DropDownListのSelectedIndexプロパティにDataGridのCurrentPageIndexを設定してカレントのページが選択された状態にします。
行86では、TextBoxに総ページ数を設定します。総ページ数は、DataGridのPageCountプロパティに格納されています。行87では、TextBoxにレコード件数を設定します。レコード件数は、DataTableのRo
行88では、SetButtons()を呼び出してページ移動ボタンを条件付で使用可能にします。
|
66: Sub BindDataGrid() |
Sub BindRepeater()の処理
このサブプロシージャでは、Repeaterに得意先の詳細を表示します。BindRepeaterは、DataGridの行を選択したときにOnItemCommandイベントから呼ばれます。
行116-117では、得意先テーブルから、選択したレコードを抽出するSQLを生成しています。行118-121のWith…End Withでは、RepeaterのDataSourceプロパティにCreateDataReader()関数で作成したDataReaderを設定しています。行120では、RepeaterのDataBind()メソッドでDataReaderをバインドしています。
|
115:
Sub BindRepeater(intCustomerID As Integer) |
Sub SetButtons()の処理
このサブプロシージャは、ページ移動ボタンのEnabledプロパティをTrue/Falseに再設定します。SetButtonsは、BindDataGrid()から呼ばれます。
行92-99では、ImageButtonのImageUrlプロパティとEnabledプロパティを初期化しています。行102-105では先頭ページを表示するとき、先頭ページと前ページのボタンを使用不可にしています。行107-110では最終ページを表示するとき、次ページと最終ページのボタンを使用不可にしています。
|
91: Sub SetButtons() |
Function CreatePageArray()関数の処理
この関数は、DataGridのページ番号が格納されているArrayList()を作成して返します。CreatePageArrayは、BindDataGrid()から呼ばれます。
|
124:
Function CreatePageArray() As ArrayList |
Function CreateDataReader()関数の処理
この関数は、データベースからレコードを抽出してDataReaderを作成して返します。CreateDataReaderは、BindRepeater()から呼ばれます。CreateDataReaderの引数には、strSQLとstrConnectionStringを指定します。strSQLには、データベースからレコードを抽出するSELECTステートメントを指定します。strConnectionStringには、Web.Configに登録されている<add>タグのkeyを指定します。strConnectionStringを省略したときは、デフォルトとしてconStringAccNwを使用します。
<add
key="conStringAccNw"
value="PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA
Source=C:\WebMatrix\webdb\Nwind.mdb" />
|
134:
Function CreateDataReader(strSQL As String, _ |
Function CreateDataSet()関数の処理
この関数は、データベースからレコードを抽出してDataSetを作成して返します。CreateDataSetは、BindDataGrid()から呼ばれます。CreateDataSetのの引数には、strSQLとstrConnectionStringを指定します。strSQLには、データベースからレコードを抽出するSELECTステートメントを指定します。strConnectionStringには、Web.Configに登録されている<add>タグのkeyを指定します。strConnectionStringを省略したときは、デフォルトとしてconStringAccNwを使用します。
<add
key="conStringAccNw"
value="PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA
Source=C:\WebMatrix\webdb\Nwind.mdb" />
|
143:
Function CreateDataSet(strSQL As String, _ |
リスト DataGridPaging.aspxのソースコード(コード編)
|
1: <%@ Page
language="vb" %> 114:
|