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
説明は以上です。