1レコード複数行表示をWebで容易に実現するMultiRow for ASP.NET
ASP.NETでDB上の1レコードを複数行として表示させるためには、GridViewコントロールでの実装は難しく、Repeaterコントロールを使ってHTMLの<table>タグを駆使して実装しなければなりません。
<table>タグを駆使する方法は、ASP.NET以外の方法でWebアプリを作成するときも同じようなものですが、例えば交互に背景色を切り替えて表を見やすくするときには同じ行定義を<ItemTemplate>タグと<AlternatingItemTemplate>タグに定義しなければならないなど、使い勝手の悪さが気になります。ソート機能やページ制御についても工夫をしなければなりません。
また、ASP.NETのWebフォーム用コントロールの使いやすさに慣れてしまうと、Repeaterコントロールは必ずしも使いやすいコントロールとは言えません。Windowsフォーム用にグレープシティから発売されている、MultiRowコントロールのASP.NET版でもあればと数年前から待ちわびていましたが、遂にMultiRow for ASP.NETが登場してくれました。
Repeaterコントロールを使った実装例
MultiRow for ASP.NETでどれくらい楽ができるかを知るために、まずはRepeaterコントロールを使った場合、どれくらい苦労するかを再検証してみましょう。サンプルソースにこちらのRepeaterコントロールを使った場合の完成版も同梱してあるので、参考にしてみてください(サンプルソース内「CZ1007RepeterControlSample」)。
作成する複数行表示は、図1のようになります。面倒なのでページ制御やソート機能は実装していません。
このデザインを実現するためのHTMLは、リスト1のようになります。
<form id="RepeaterControlSample_Form" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table border='1'>
<tr><th rowspan="2">日付</th><th colspan="5">製品名</th></tr>
<tr><th>伝票No</th><th>区分</th><th>単価</th><th>数量</th><th>金額z</th></tr>
</HeaderTemplate>
<ItemTemplate>
<tr style="background-color:White;">
<td rowspan="2"><%# Format(DataBinder.Eval(Container.DataItem, "Date"), "yyyy/MM/dd")%> </td>
<td colspan="5"><%# DataBinder.Eval(Container.DataItem, "Products").ToString%> </td>
</tr>
<tr style="background-color:White;">
<td><%# DataBinder.Eval(Container.DataItem, "SlipNo")%> </td>
<td><%# DataBinder.Eval(Container.DataItem, "Category")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "UnitPrice"), "#,##0")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "Number"), "#,##0")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "UnitPrice") *
DataBinder.Eval(Container.DataItem, "Number"), "#,##0")%> </td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr style="background-color:#e0ffe0;">
<td rowspan="2"><%# Format(DataBinder.Eval(Container.DataItem, "Date"), "yyyy/MM/dd")%> </td>
<td colspan="5"><%# DataBinder.Eval(Container.DataItem, "Products").ToString%> </td>
</tr>
<tr style="background-color:#e0ffe0;">
<td><%# DataBinder.Eval(Container.DataItem, "SlipNo")%> </td>
<td><%# DataBinder.Eval(Container.DataItem, "Category")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "UnitPrice"), "#,##0")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "Number"), "#,##0")%> </td>
<td style="text-align:right;"><%# Format(DataBinder.Eval(Container.DataItem, "UnitPrice") *
DataBinder.Eval(Container.DataItem, "Number"), "#,##0")%> </td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
Repeaterコントロールのデータソースとして指定したDataSetに格納されたレコードを<td>タグで囲んで出力するために、DataBinder.Evalを使っています。デザイナの[デザイン]タブでは編集できないため、[コード]タブでHTMLを直書きして行います。
Repeaterコントロールで交互に背景色を変えるときは、<ItemTemplate>タグと<AlternatingItemTemplate>タグの中に同じ行定義を記述し、<tr>タグのStyleに指定するBackground-Colorを別の背景色にすることで実現します。
この実現方法の場合、データの配置などを変えるときは、次のような作業を行わなくてはなりません。
<HeaderTemplate>でヘッダ行の変更<ItemTemplate>でデータ行の変更- (2)の変更を
<AlternatingItemTemplate>に反映
実際、開発現場でお客様からのレビューを受けてデザイン変更していると、つい(3)のステップを忘れてしまうときがあります。私自身、実装していて非常に面倒で嫌になってしまう手順でした。
Repeaterコントロールの実行
Repeaterコントロールに値を表示するためには、リスト2のようにDataSetのテーブルをDataSourceプロパティに設定してから、DataBindメソッドを実行します。
Imports System.Data
Partial Class RepeaterControlSample
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
Call GetRecords()
End If
End Sub
Private Function GetRecords() As Boolean
Dim isOK As Boolean = False
Using _proc As New CZ1007Bound
Dim ds As DataSet = _proc.GetRecords("admin", "", "WS-DF502")
Me.Repeater1.DataSource = ds.Tables("Bill")
Me.Repeater1.DataBind()
isOK = True
End Using
Return isOK
End Function
End Class
次にMultiRow for ASP.NETを使った際の、実現方法を見ていきましょう。

