DataList または Repeater コントロールのレポート データをページングする (C#)

作成者: Scott Mitchell

PDF のダウンロード

DataList と Repeater はどちらも自動ページングまたは並べ替えのサポートを提供しませんが、このチュートリアルでは、DataList または Repeater にページング サポートを追加する方法について説明します。これにより、より柔軟なページングとデータ表示インターフェイスが可能になります。

はじめに

ページングと並べ替えは、オンライン アプリケーションでデータを表示する場合の 2 つの非常に一般的な機能です。 たとえば、オンライン書店で ASP.NET 書籍を検索する場合、そのような書籍は数百冊ある可能性がありますが、検索結果を一覧表示するレポートには 1 ページあたり 10 個の一致しか表示されません。 さらに、結果はタイトル、価格、ページ数、作成者名などによって並べ替えることができます。 「レポート データのページングと並べ替え」チュートリアルで説明したように、GridView、DetailsView、および FormView コントロールはすべて、チェックボックスのチェック ボックスで有効にできる組み込みのページング サポートを提供します。 GridView には、並べ替えのサポートも含まれています。

残念ながら、DataList と Repeater のどちらも、自動ページングまたは並べ替えのサポートを提供しません。 このチュートリアルでは、DataList または Repeater にページング サポートを追加する方法について説明します。 ページング インターフェイスを手動で作成し、レコードの適切なページを表示し、ポストバック間でアクセスされているページを思い出す必要があります。 これには GridView、DetailsView、または FormView よりも時間とコードが必要ですが、DataList と Repeater を使用すると、より柔軟なページングとデータ表示インターフェイスが可能になります。

注意

このチュートリアルでは、ページングのみに重点を置いています。 次のチュートリアルでは、並べ替え機能の追加に注目します。

手順 1: ページングと並べ替えのチュートリアル Web ページの追加

このチュートリアルを開始する前に、まず、このチュートリアルと次のページに必要な ASP.NET ページを追加してみましょう。 まず、 という名前 PagingSortingDataListRepeaterのプロジェクトに新しいフォルダーを作成します。 次に、次の 5 つの ASP.NET ページをこのフォルダーに追加し、マスター ページを使用するようにすべてのページ Site.masterを構成します。

  • Default.aspx
  • Paging.aspx
  • Sorting.aspx
  • SortingWithDefaultPaging.aspx
  • SortingWithCustomPaging.aspx

PagingSortingDataListRepeater フォルダーを作成し、チュートリアル ASP.NET ページを追加する

図 1: フォルダーを PagingSortingDataListRepeater 作成し、チュートリアル ASP.NET ページを追加する

次に、ページをDefault.aspx開き、ユーザー コントロールをSectionLevelTutorialListing.ascxUserControlsフォルダーからデザイン画面にドラッグします。 マスター ページとサイト ナビゲーションのチュートリアルで作成したこのユーザー コントロールは、サイト マップを列挙し、箇条書きの現在のセクションにこれらのチュートリアルを表示します。

SectionLevelTutorialListing.ascx ユーザー コントロールを Default.aspx に追加する

図 2: ユーザー コントロールを SectionLevelTutorialListing.ascx に追加する Default.aspx (クリックするとフルサイズの画像が表示されます)

箇条書きに作成するページングと並べ替えのチュートリアルを表示するには、サイト マップに追加する必要があります。 ファイルを Web.sitemap 開き、DataList サイト マップ ノード マークアップを使用して編集と削除の後に次のマークアップを追加します。

<siteMapNode
    url="~/PagingSortingDataListRepeater/Default.aspx"
    title="Paging and Sorting with the DataList and Repeater"
    description="Paging and Sorting the Data in the DataList and Repeater Controls">
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Paging.aspx"
        title="Paging"
        description="Learn how to page through the data shown
                     in the DataList and Repeater controls." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Sorting.aspx"
        title="Sorting"
        description="Sort the data displayed in a DataList or
                     Repeater control." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithDefaultPaging.aspx"
        title="Sorting with Default Paging"
        description="Create a DataList or Repeater control that is paged using
                     default paging and can be sorted." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithCustomPaging.aspx"
        title="Sorting with Custom Paging"
        description="Learn how to sort the data displayed in a DataList or
                     Repeater control that uses custom paging." />
</siteMapNode>

新しい ASP.NET ページを含むようにサイト マップを更新する

図 3: 新しい ASP.NET ページを含むようにサイト マップを更新する

ページングのレビュー

前のチュートリアルでは、GridView、DetailsView、および FormView コントロールのデータをページングする方法について説明しました。 これら 3 つのコントロールは、コントロールのスマート タグで [ページングを有効にする] オプションをオンにするだけで実装できる 、既定のページング と呼ばれる単純な形式のページングを提供します。 既定のページングでは、データのページが最初のページにアクセスするか、ユーザーが別のページのデータに移動するたびに、GridView、DetailsView、または FormView コントロールによって ObjectDataSource からすべての データが再要求されます。 次に、要求されたページ インデックスとページごとに表示するレコードの数を指定して、表示する特定のレコード セットを切り取ります。 既定のページングについては、「レポート データのページング と並べ替え 」チュートリアルで詳しく説明しました。

既定のページングでは各ページのすべてのレコードが再要求されるため、十分に大量のデータをページングする場合は実用的ではありません。 たとえば、ページ サイズが 10 の 50,000 レコードをページングするとします。 ユーザーが新しいページに移動するたびに、50,000 個のレコードがすべてデータベースから取得される必要があります。ただし、表示されるレコードは 10 個のみです。

カスタム ページング では、要求されたページに表示するレコードの正確なサブセットのみを取得することで、既定のページングのパフォーマンスの問題を解決します。 カスタム ページングを実装する場合は、正しいレコードのセットだけを効率的に返す SQL クエリを記述する必要があります。 2005 年SQL Server新しいROW_NUMBER()キーワード (keyword)を使用してこのようなクエリを作成する方法については、「大量のデータを効率的にページングする」チュートリアルを参照してください。

DataList コントロールまたは Repeater コントロールに既定のページングを実装するには、 クラスをPagedDataSource、そのコンテンツがページングされる をProductsDataTable囲むラッパーとして使用できます。 PagedDataSourceクラスには、DataSource列挙可能なオブジェクトに割り当てることができるプロパティと、ページごとに表示するレコード数とPageSizeCurrentPageIndex現在のページ インデックスを示すプロパティがあります。 これらのプロパティを設定すると、 を PagedDataSource 任意のデータ Web コントロールのデータ ソースとして使用できます。 PagedDataSourceを列挙すると、 プロパティと CurrentPageIndex プロパティに基づいてPageSize、その内部DataSourceレコードの適切なサブセットのみが返されます。 図 4 は、 クラスの機能を PagedDataSource 示しています。

PagedDataSource は、ページング可能なインターフェイスを使用して列挙可能なオブジェクトをラップします

図 4: PagedDataSource ページング可能なインターフェイスを使用して列挙可能なオブジェクトをラップする

オブジェクトは PagedDataSource 、ビジネス ロジック レイヤーから直接作成および構成し、ObjectDataSource を介して DataList または Repeater にバインドすることも、ASP.NET ページの分離コード クラスで直接作成および構成することもできます。 後者の方法を使用する場合は、ObjectDataSource の使用を見落とし、代わりにページデータを DataList または Repeater にプログラムでバインドする必要があります。

オブジェクトには PagedDataSource 、カスタム ページングをサポートするプロパティもあります。 ただし、表示する正確なレコードを返すカスタム ページング用に設計された BLL メソッドがクラスにProductsBLL既に存在するため、カスタム ページングには を使用PagedDataSourceしてバイパスできます。

このチュートリアルでは、適切に構成された オブジェクトを返す新しいメソッドを クラスに ProductsBLL 追加することで、DataList に既定のページングを実装する方法について説明 PagedDataSource します。 次のチュートリアルでは、カスタム ページングの使用方法について説明します。

手順 2: ビジネス ロジック レイヤーに既定のページング メソッドを追加する

クラスには ProductsBLL 現在、すべての製品情報 GetProducts() を返すメソッドと、開始インデックス GetProductsPaged(startRowIndex, maximumRows)で製品の特定のサブセットを返すメソッドがあります。 既定のページングでは、GridView、DetailsView、および FormView コントロールはすべて、 メソッドを GetProducts() 使用してすべての製品を取得しますが、 を使用 PagedDataSource してレコードの正しいサブセットのみを表示します。 DataList コントロールと Repeater コントロールを使用してこの機能をレプリケートするには、この動作を模倣する新しいメソッドを BLL に作成します。

2 つの整数入力パラメーターを ProductsBLL 受け取る という名前 GetProductsAsPagedDataSource のクラスに メソッドを追加します。

  • pageIndex 表示するページのインデックス、0 でインデックスを付ける、および
  • pageSize ページごとに表示するレコードの数。

GetProductsAsPagedDataSourceは、 からGetProducts()すべてのレコードを取得することによって開始されます。 次に、オブジェクトをPagedDataSource作成し、その CurrentPageIndex プロパティと PageSize プロパティを渡された パラメーターとpageSizeパラメーターの値にpageIndex設定します。 メソッドは、この構成済 PagedDataSourceみの を返すことによって終了します。

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public PagedDataSource GetProductsAsPagedDataSource(int pageIndex, int pageSize)
{
    // Get ALL of the products
    Northwind.ProductsDataTable products = GetProducts();
    // Limit the results through a PagedDataSource
    PagedDataSource pagedData = new PagedDataSource();
    pagedData.DataSource = products.Rows;
    pagedData.AllowPaging = true;
    pagedData.CurrentPageIndex = pageIndex;
    pagedData.PageSize = pageSize;
    return pagedData;
}

手順 3: 既定のページングを使用して DataList に製品情報を表示する

クラスに メソッドをGetProductsAsPagedDataSourceProductsBLL追加すると、既定のページングを提供する DataList または Repeater を作成できるようになりました。 まず、フォルダー内のページをPaging.aspxPagingSortingDataListRepeater開き、DataList をツールボックスからDesignerにドラッグし、DataList の ID プロパティを にProductsDefaultPaging設定します。 DataList のスマート タグから、 という名前 ProductsDefaultPagingDataSource の新しい ObjectDataSource を作成し、 メソッドを使用して GetProductsAsPagedDataSource データを取得するように構成します。

ObjectDataSource を作成し、GetProductsAsPagedDataSource () メソッドを使用するように構成する

図 5: ObjectDataSource を作成し、 メソッドを使用 GetProductsAsPagedDataSource() するように構成する (クリックするとフルサイズの画像が表示されます)

[UPDATE]、[INSERT]、[DELETE] タブのドロップダウン リストを (None) に設定します。

[UPDATE]、[INSERT]、[DELETE] タブの Drop-Down Lists を [(なし)] に設定します

図 6: UPDATE、INSERT、DELETE タブの Drop-Down Lists を (なし) に設定します (フルサイズの画像を表示する 場合はクリックします)

メソッドは GetProductsAsPagedDataSource 2 つの入力パラメーターを必要とするため、これらのパラメーター値のソースを求めるメッセージが表示されます。

ページ インデックスとページ サイズの値は、ポストバック間で記憶する必要があります。 ビュー ステートに格納したり、クエリ文字列に永続化したり、セッション変数に格納したり、他の手法を使用して記憶したりすることができます。 このチュートリアルでは、特定のページのデータをブックマークできる利点がある querystring を使用します。

特に、 パラメーターと パラメーターには、それぞれ querystring フィールド pageIndex と pageSize pageSize pageIndex を使用します (図 7 を参照)。 ユーザーがこのページに初めてアクセスしたときに querystring 値が存在しないため、これらのパラメーターの既定値を設定します。 の場合 pageIndex、既定値を 0 (データの最初のページが表示されます) に設定し、 pageSize 既定値を 4 に設定します。

PageIndex パラメーターと pageSize パラメーターのソースとして QueryString を使用する

図 7: パラメーターと pageSize パラメーターのソースpageIndexとして QueryString を使用する (クリックするとフルサイズの画像が表示されます)

ObjectDataSource を構成すると、Visual Studio によって DataList の が ItemTemplate 自動的に作成されます。 ItemTemplateをカスタマイズして、製品の名前、カテゴリ、サプライヤーのみが表示されるようにします。 また、DataList の RepeatColumns プロパティを 2 に、その Width プロパティを 100% に、s ItemStyleWidth を 50% に設定します。 これらの幅の設定では、2 つの列の間隔が等しくなります。

これらの変更を行った後、DataList と ObjectDataSource のマークアップは次のようになります。

<asp:DataList ID="ProductsDefaultPaging" runat="server" Width="100%"
    DataKeyField="ProductID" DataSourceID="ProductsDefaultPagingDataSource"
    RepeatColumns="2" EnableViewState="False">
    <ItemTemplate>
        <h4><asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>'></asp:Label></h4>
        Category:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Eval("CategoryName") %>'></asp:Label><br />
        Supplier:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Eval("SupplierName") %>'></asp:Label><br />
        <br />
        <br />
    </ItemTemplate>
    <ItemStyle Width="50%" />
</asp:DataList>
<asp:ObjectDataSource ID="ProductsDefaultPagingDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsAsPagedDataSource">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="0" Name="pageIndex"
             QueryStringField="pageIndex" Type="Int32" />
        <asp:QueryStringParameter DefaultValue="4" Name="pageSize"
             QueryStringField="pageSize" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

注意

このチュートリアルでは更新または削除の機能を実行していないため、DataList のビューステートを無効にして、レンダリングされるページ サイズを小さくすることができます。

ブラウザーを使用してこのページに最初にアクセスする場合、 パラメーターと pageSize querystring パラメーターはどちらも指定されませんpageIndex。 そのため、既定値の 0 と 4 が使用されます。 図 8 に示すように、最初の 4 つの製品を表示する DataList が作成されます。

最初の 4 つの製品が一覧表示されます

図 8: 最初の 4 つの製品が一覧表示されます (クリックするとフルサイズの画像が表示されます)

ページング インターフェイスがない場合、現在、ユーザーがデータの 2 ページ目に移動するための簡単な手段はありません。 手順 4 でページング インターフェイスを作成します。 ただし、現時点では、ページングは、クエリ文字列でページング条件を直接指定することによってのみ実行できます。 たとえば、2 番目のページを表示するには、ブラウザーのアドレス バーの URL を から Paging.aspx に変更し、Enter キーを Paging.aspx?pageIndex=2 押します。 これにより、データの 2 ページ目が表示されます (図 9 を参照)。

データの 2 ページ目が表示されている DataList ウィンドウの [データのページング] のスクリーンショット。

図 9: データの 2 ページ目が表示されます (フルサイズの画像を表示する場合はクリックします)

手順 4: ページング インターフェイスを作成する

実装できるさまざまなページング インターフェイスがあります。 GridView、DetailsView、および FormView コントロールには、次の 4 つの異なるインターフェイスが用意されています。

  • 次に、以前の ユーザーは一度に 1 つのページを次のページまたは前のページに移動できます。
  • 次に、[前へ]、[最初]、[最後 ]、[次へ] ボタンと [前へ] ボタンに加えて、このインターフェイスには、最初または最後のページに移動するための [最初] ボタンと [最後] ボタンが含まれます。
  • 数値 はページング インターフェイスのページ番号を一覧表示します。これにより、ユーザーは特定のページにすばやく移動できます。
  • [数値]、[最初]、[最後 ] には、数値ページ番号に加えて、最初または最後のページに移動するためのボタンが含まれています。

DataList と Repeater の場合、ページング インターフェイスを決定して実装する必要があります。 これには、ページに必要な Web コントロールを作成し、特定のページング インターフェイス ボタンがクリックされたときに要求されたページを表示する必要があります。 さらに、特定のページング インターフェイス コントロールを無効にする必要がある場合があります。 たとえば、Next、Previous、First、Last インターフェイスを使用してデータの最初のページを表示すると、[最初] と [前へ] の両方のボタンが無効になります。

このチュートリアルでは、Next、Previous、First、Last インターフェイスを使用します。 ページに 4 つのボタン Web コントロールを追加し、そのコントロールを ID 、、NextPagePrevPage、および LastPageFirstPage設定します。 プロパティを Text First、Prev、 < Next>、Last >> に<<設定します。

<asp:Button runat="server" ID="FirstPage" Text="<< First" />
<asp:Button runat="server" ID="PrevPage" Text="< Prev" />
<asp:Button runat="server" ID="NextPage" Text="Next >" />
<asp:Button runat="server" ID="LastPage" Text="Last >>" />

次に Click 、これらのボタンごとにイベント ハンドラーを作成します。 すぐに、要求されたページを表示するために必要なコードを追加します。

ページングされるレコードの合計数を記憶する

選択したページング インターフェイスに関係なく、ページングされるレコードの合計数を計算して記憶する必要があります。 合計行数 (ページ サイズと組み合わせて) によって、ページングされるデータの合計ページ数が決まります。これにより、追加されるページング インターフェイス コントロールまたは有効になっているページング インターフェイス コントロールが決まります。 作成している Next、Previous、First、Last インターフェイスでは、ページ数は次の 2 つの方法で使用されます。

  • 最後のページが表示されているかどうかを確認するには、[次へ] ボタンと [最後のページ] ボタンが無効になっています。
  • ユーザーが [最後] ボタンをクリックした場合は、インデックスがページ数より 1 小さい最後のページに移動する必要があります。

ページ数は、合計行数の上限をページ サイズで割った値として計算されます。 たとえば、1 ページあたり 4 つのレコードを含む 79 レコードをページングする場合、ページ数は 20 (79 / 4 の上限) になります。 数値ページング インターフェイスを使用している場合、この情報は表示する数値ページ ボタンの数を示します。ページング インターフェイスに [次へ] または [最後] ボタンが含まれている場合は、ページ数を使用して、[次へ] または [最後] ボタンを無効にするタイミングが決定されます。

ページング インターフェイスに [最後] ボタンが含まれている場合は、最後のボタンがクリックされたときに最後のページ インデックスを決定できるように、ページングされるレコードの合計数をポストバック間で記憶することが不可欠です。 これを容易にするために、ASP.NET ページの分離コード クラスに、その値を保持して状態を表示するプロパティを作成 TotalRowCount します。

private int TotalRowCount
{
    get
    {
        object o = ViewState["TotalRowCount"];
        if (o == null)
            return -1;
        else
            return (int)o;
    }
    set
    {
        ViewState["TotalRowCount"] = value;
    }
}

TotalRowCount加えて、ページ インデックス、ページ サイズ、ページ数に簡単にアクセスできるように、読み取り専用のページ レベルのプロパティを作成するのに 1 分かかります。

private int PageIndex
{
    get
    {
        if (!string.IsNullOrEmpty(Request.QueryString["pageIndex"]))
            return Convert.ToInt32(Request.QueryString["pageIndex"]);
        else
            return 0;
    }
}
private int PageSize
{
    get
    {
        if (!string.IsNullOrEmpty(Request.QueryString["pageSize"]))
            return Convert.ToInt32(Request.QueryString["pageSize"]);
        else
            return 4;
    }
}
private int PageCount
{
    get
    {
        if (TotalRowCount <= 0 || PageSize <= 0)
            return 1;
        else
            return ((TotalRowCount + PageSize) - 1) / PageSize;
    }
}

ページングされるレコードの合計数の決定

PagedDataSource ObjectDataSource の Select() メソッドから返されたオブジェクトは、DataList に表示されるサブセットのみが表示される場合でも、すべての製品レコード内に含まれます。 s Count プロパティPagedDataSource、DataList DataSourceCount に表示されるアイテムの数のみを返します。プロパティは、 内のアイテムの合計数をPagedDataSource返します。 したがって、ASP.NET ページの プロパティに s TotalRowCount プロパティの値をPagedDataSourceDataSourceCount割り当てる必要があります。

これを実現するには、ObjectDataSource の Selected イベントのイベント ハンドラーを作成します。 イベント ハンドラーでは、 Selected この場合、ObjectDataSource s Select() メソッドの戻り値である にアクセスできます PagedDataSource

protected void ProductsDefaultPagingDataSource_Selected
    (object sender, ObjectDataSourceStatusEventArgs e)
{
    // Reference the PagedDataSource bound to the DataList
    PagedDataSource pagedData = (PagedDataSource)e.ReturnValue;
    // Remember the total number of records being paged through
    // across postbacks
    TotalRowCount = pagedData.DataSourceCount;
}

要求されたデータ ページの表示

ユーザーがページング インターフェイスのいずれかのボタンをクリックすると、要求されたデータ ページを表示する必要があります。 ページング パラメーターは querystring を介して指定されているため、要求されたデータ ページを表示するには、 を使用して、ユーザーのブラウザーが適切なページング パラメーターを使用 Response.Redirect(url) してページを要求し直 Paging.aspx します。 たとえば、データの 2 ページ目を表示するには、ユーザーを に Paging.aspx?pageIndex=1リダイレクトします。

これを容易にするために、ユーザーを RedirectUser(sendUserToPageIndex)Paging.aspx?pageIndex=sendUserToPageIndexリダイレクトするメソッドを作成します。 次に、4 つの Button Click イベント ハンドラーからこのメソッドを呼び出します。 FirstPageClickイベント ハンドラーで、 を呼び出RedirectUser(0)して最初のページに送信します。イベント ハンドラーではClickPrevPage、ページ インデックスとして を使用PageIndex - 1します。

protected void FirstPage_Click(object sender, EventArgs e)
{
    // Send the user to the first page
    RedirectUser(0);
}
protected void PrevPage_Click(object sender, EventArgs e)
{
    // Send the user to the previous page
    RedirectUser(PageIndex - 1);
}
protected void NextPage_Click(object sender, EventArgs e)
{
    // Send the user to the next page
    RedirectUser(PageIndex + 1);
}
protected void LastPage_Click(object sender, EventArgs e)
{
    // Send the user to the last page
    RedirectUser(PageCount - 1);
}
private void RedirectUser(int sendUserToPageIndex)
{
    // Send the user to the requested page
    Response.Redirect(string.Format("Paging.aspx?pageIndex={0}&pageSize={1}",
        sendUserToPageIndex, PageSize));
}

イベント ハンドラーが Click 完了したら、ボタンをクリックして DataList のレコードをページングできます。 少しお試しください。

ページング インターフェイス コントロールの無効化

現在、4 つのボタンはすべて、表示されているページに関係なく有効になっています。 ただし、データの最初のページを表示する場合は [最初] ボタンと [前へ] ボタン、最後のページを表示する場合は [次へ] ボタンと [最後] ボタンを無効にします。 PagedDataSource ObjectDataSource の Select() メソッドによって返されるオブジェクトにはプロパティIsFirstPageがあり、IsLastPageデータの最初のページまたは最後のページを表示しているかどうかを調べることができます。

ObjectDataSource のイベント ハンドラーに次を Selected 追加します。

// Configure the paging interface based on the data in the PagedDataSource
FirstPage.Enabled = !pagedData.IsFirstPage;
PrevPage.Enabled = !pagedData.IsFirstPage;
NextPage.Enabled = !pagedData.IsLastPage;
LastPage.Enabled = !pagedData.IsLastPage;

この追加により、最初のページを表示するときに [最初] ボタンと [前へ] ボタンが無効になり、最後のページを表示するときに [次へ] ボタンと [最後へ] ボタンが無効になります。

現在表示しているページと合計ページ数をユーザーに通知することで、ページング インターフェイスを完了しましょう。 Label Web コントロールをページに追加し、そのプロパティを IDCurrentPageNumber設定します。 Text表示されている現在のページ () と合計ページ数 (PageIndex + 1) が含まれるよう、ObjectDataSource の Selected イベント ハンドラーでそのプロパティを設定しますPageCount

// Display the current page being viewed...
CurrentPageNumber.Text = string.Format("You are viewing page {0} of {1}...",
    PageIndex + 1, PageCount);

図 10 は、最初にアクセスした日時を示しています Paging.aspx 。 querystring は空であるため、DataList は既定で最初の 4 つの製品を表示します。[最初] ボタンと [前へ] ボタンは無効になっています。 [次へ] をクリックすると、次の 4 つのレコードが表示されます (図 11 を参照)。[最初] ボタンと [前へ] ボタンが有効になりました。

データの最初のページが表示される

図 10: データの最初のページが表示されます (フルサイズの画像を表示する場合はクリックします)

DataList ウィンドウの [データのページング] ウィンドウの 2 ページ目のスクリーンショット。

図 11: データの 2 ページ目が表示されます (フルサイズの画像を表示する場合はクリックします)

注意

ページごとに表示するページ数をユーザーが指定できるようにすることで、ページング インターフェイスをさらに強化できます。 たとえば、DropDownList には、5、10、25、50、All などのリスト ページ サイズ オプションを追加できます。 ページ サイズを選択したら、ユーザーを にリダイレクトする Paging.aspx?pageIndex=0&pageSize=selectedPageSize必要があります。 この拡張機能の実装は、読者向けの演習として残しておきます。

カスタム ページングの使用

DataList は、非効率的な既定のページング手法を使用して、データをページングします。 十分に大量のデータをページングする場合は、カスタム ページングを使用することが不可欠です。 実装の詳細は若干異なりますが、DataList でのカスタム ページングの実装の背後にある概念は、既定のページングと同じです。 カスタム ページングでは、 クラスの メソッド GetProductsPaged (ProductBLLではなくGetProductsAsPagedDataSource) を使用します。 「大量のデータを効率的にページングする」チュートリアルで説明したように、GetProductsPaged開始行インデックスと返す行の最大数を渡す必要があります。 これらのパラメーターは、既定のページングで使用される パラメーターとpageSize同様にpageIndex、クエリ文字列を使用して保持できます。

カスタム ページングはないため、別の PagedDataSource 手法を使用して、ページングされるレコードの合計数と、データの最初のページと最後のページのどちらを表示するかを決定する必要があります。 クラスの メソッドは TotalNumberOfProducts()ProductsBLL ページングされる製品の合計数を返します。 データの最初のページが表示されているかどうかを確認するには、開始行インデックスが 0 の場合は、最初のページが表示されていることを確認します。 最後のページは、開始行インデックスと返す最大行数が、ページングされるレコードの合計数以上の場合に表示されます。

次のチュートリアルでは、カスタム ページングの実装について詳しく説明します。

まとめ

DataList コントロールも Repeater コントロールも、GridView コントロール、DetailsView コントロール、および FormView コントロールにあるすぐに使用できるページング サポートは提供しませんが、このような機能は最小限の労力で追加できます。 既定のページングを実装する最も簡単な方法は、 内 PagedDataSource の製品セット全体をラップし、 を DataList または Repeater にバインド PagedDataSource することです。 このチュートリアルでは、 メソッドを GetProductsAsPagedDataSource クラスに追加して ProductsBLL を返しました PagedDataSource。 クラスにはProductsBLL、カスタム ページングと TotalNumberOfProductsに必要なメソッドが既にGetProductsPaged含まれています。

カスタム ページング用に表示する正確なレコードセットまたは既定のページング用のすべての PagedDataSource レコードを取得するだけでなく、ページング インターフェイスを手動で追加する必要もあります。 このチュートリアルでは、4 つのボタン Web コントロールを含む Next、Previous、First、Last インターフェイスを作成しました。 また、現在のページ番号と合計ページ数を表示する Label コントロールが追加されました。

次のチュートリアルでは、DataList と Repeater に並べ替えのサポートを追加する方法について説明します。 また、ページ分割と並べ替えの両方が可能な DataList を作成する方法についても説明します (既定のページングとカスタム ページングを使用する例を使用)。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Liz Shulok、Ken Pespisa、Bernadette Leigh でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。