ASP.NET 3.5 で新しく追加されたSystem.Web.UI.WebControls名前空間のListViewコントロールとDataPagerコントロールを使ったサンプルを掲載します。ListVIewの簡単なサンプルはリンク先に掲載されているので、今回はグルーピングを使ったサンプルを作成してみます。

動作確認環境

  • サーバー : Visual Studio 2008 Professional組み込みコンテナ
  • クライアント : IE 7.0
  • 開発環境: Visual Studio 2008 Professional 英語版
  • .NET 3.5
  • 使用したデータベース:AdventureWorks

データベースはAdventureWorksを使用しました。データベースはCodePlexのページからダウンロードできます。http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004

1. サンプルプログラムの作成

1.1 新規プロジェクトの作成

Visual Studio 2008を起動して空のソリューション(ListViewとしました)を作成します。ソリューションエクスプローラを右クリックし、[Add]→[New Project]でASP.NET Wep ApplicationをプロジェクトのテンプレートとしてListViewというプロジェクトを作成します。AdventureWorksDBのインストールと接続の設定は省略しています。サンプル実行環境の構築 を参照して下さい。

1.2 プログラムの作成

ListViewはLayoutTemplateに全体のレイアウトを設定し、DataPageコントロールを使用して、ページングをコントロールします。今回はグループテンプレートなど、いくつかのテンプレートを使ってみます。使用できるテンプレートやイベントなどを含めた簡単な使い方と説明はMSDNライブラリの各クラスの説明のページに記載されています。

今回はグループテンプレートを使うので、Default.aspxを次のように編集します。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ListView._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ListView ID="ListView1" runat="server" DataKeyNames="ProductID" DataSourceID="SqlDataSource1"
            ItemPlaceholderID="itemContainerCell" GroupPlaceholderID="groupContainerRow"
            GroupItemCount="3">
            <LayoutTemplate>
                <table id="Table1" runat="server" rules="all">
                    <thead>
                        <tr style="background-color: Silver">
                            <td colspan="8">
                                ヘッダ
                            </td>
                        </tr>
                    </thead>
                    <tbody>
                        <tr runat="server" id="groupContainerRow" />
                    </tbody>
                    <tfoot>
                        <tr style="background-color: Aqua">
                            <td colspan="8" align="center">
                                <asp:DataPager ID="DataPager1" runat="server" PageSize="7">
                                    <Fields>
                                        <asp:NumericPagerField ButtonCount="15" />
                                        <asp:NextPreviousPagerField />
                                    </Fields>
                                </asp:DataPager>
                            </td>
                        </tr>
                    </tfoot>
                </table>
            </LayoutTemplate>
            <GroupTemplate>
                <tr id="Tr1" runat="server">
                    <td runat="server" id="itemContainerCell" />
                </tr>
            </GroupTemplate>
            <ItemTemplate>
                <td runat="server">
                    <asp:Label runat="server" ID="lblNameHeader" Text="Name:" />
                    <asp:Label runat="server" ID="lblName" Text='<%# Eval("Name") %>' /><br />
                </td>
                <td runat="server">
                    <asp:Label runat="server" ID="lblProductNumberHeader" Text="ProductNumber:" />
                    <asp:Label runat="server" ID="lblProductNumber" Text='<%# Eval("ProductNumber") %>' />
                </td>
            </ItemTemplate>
            <EmptyDataTemplate>
                <td colspan="4">
                    データがみつかりません
                </td>
            </EmptyDataTemplate>
            <GroupSeparatorTemplate>
                <tr runat="server">
                    <td colspan="8" style="background-color:Green">Group Separator</td>
                </tr>
            </GroupSeparatorTemplate>
            <ItemSeparatorTemplate>
                <td runat="server" style="background-color:Teal">Item Separator</td>
            </ItemSeparatorTemplate>
            <EmptyItemTemplate>
                <td colspan="2" style="background-color: Yellow;">
                    Empty Cell
                </td>
            </EmptyItemTemplate>
        </asp:ListView>
        <asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1">
            <Fields>
                <asp:TemplatePagerField>
                    <PagerTemplate>
                        <asp:Label runat="server" ID="lblMaximumRow" Text='<%# "Max Row " +  Container.TotalRowCount %>' />
                        <asp:Label runat="server" ID="lblCurrentStartRow" Text='<%# "StartCurrentRow" + Container.StartRowIndex  %>' />
                        <asp:Label runat="server" ID="lblMaxCurrentRow" Text='<%# "MaxCurrentRow" + Container.MaximumRows   %>' />
                        <asp:Label runat="server" ID="lblCurrentPageIndex" Text='<%# "Current Page " + ((Container.StartRowIndex/Container.PageSize) + 1) %>' />
                    </PagerTemplate>
                </asp:TemplatePagerField>
            </Fields>
        </asp:DataPager>
        <asp:Button runat="server" ID="btnLast" Text="Last" onclick="btnLast_Click" />
    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnection %>"
        SelectCommand="select * from Production.Product"></asp:SqlDataSource>
    </form>
</body>
</html>

次のようにコードビハインドファイルDefault.aspx.csにボタンクリックイベントのイベントハンドラを記述します。

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace ListView
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLast_Click(object sender, EventArgs e)
        {
            DataPager2.SetPageProperties(DataPager2.TotalRowCount, 1, true);
        }


    }
}

- GroupTemplate,ItemTemplateのプレースホルダIDについて
ListViewのサンプルでデータを表示するプレースホルダーとしてよくitemPlaceholder というIDが設定されていますがこれはListView.ItemPlaceholderIDの既定値がitemPlaceholder のためです。なので、サンプルのようにItemPlaceholderIDを設定すれば、自由に設定できます。
同様に、グループ化に使うプレースホルダーのidは groupPlaceholderが使われます。これは、ListView.GroupPlaceholderIDの既定値がgroupPlaceholder のためです。ItemPlaceholderIDと同じように自由に設定できます。

1.3 実行確認

Visual StudioでF5ボタンをクリックしてデバッグ実行すると、1行がProductテーブルの3レコードごとにグループ化されて表示されます。グループの境界にはGroupSeparatorTemplateで設定した行が表示され、ItemSeparatorTemplateで設定した内容が、ItemTemplateの境界ごとのテーブルのセルとして出力されます。1ページに表示されるレコード数はDataPagerで設定したPageSizeの値が7なので、7レコード分データが表示され、残りの2レコード分の部分はEmplyItemTemplateで設定した内容が表示されます。

 

ListViewは既存のコントロールGridView,DataList,FormView,DetailsViewと同じ機能をすべて提供できるコントロールです。加えてレイアウト機能はさらに強化されています。編集、追加、削除などは既存のGridViewなどと同じように行えます。

2. その他情報

ListViewをVisual Studioをデザイナ上で選択して表示されるスマートタグを選択すると、あらかじめ定義されたテンプレートを使用してListViewをフォーマットすることができます。フォーマットするには、スマートタグをクリックしたときに表示される下図のTaskの中でConfigure ListViewを選択します。

Configure ListViewを選択するとConfigure ListViewダイアログが表示されるので、定義されたレイアウト、ページャ等を設定することができます。

MSDNライブラリのほかに、ListViewはMSDNの2008年3月号でも取り上げられています。

必要な唯一のデータバインド コントロール 
http://msdn.microsoft.com/ja-jp/magazine/cc337898.aspx

説明は以上です。