| 列1 | 列2 |
|---|---|
| A | a |
| A | b |
| B | a |
| B | b |
このようなデータの列1の重複データをrowspanでまとめて表示したい場合、
| 列1 | 列2 |
|---|---|
| A | a |
| b | |
| B | a |
| b |
これをASP.NETで2重構造のRepeaterで実現する方法を紹介する。
■データの取得
■データの取得
まとめる列で集計したデータと、その列に紐づくデータを別々に取得する。
まとめる列には、その明細の行数をカウントしておく。
SQLで例えると
紐づく明細のデータ
■DataTableの作成
'-- まとめる列の集計クエリ Select 列1, count(*) rowspan From Table1 '-- 明細のクエリ、まとめる列を含める。 Select 列1, 列2 From Table1まとめる列のデータ
| 列1 | rowspan |
|---|---|
| A | 2 |
| B | 2 |
紐づく明細のデータ
| 列1 | 列2 |
|---|---|
| A | a |
| A | b |
| B | a |
| B | b |
それぞれ取得したDataTableの列1でDataRelationを作ることにより紐付ける。
■DataTableの作成
Protected Function GetDataSource() As DataTable
Dim row As DataRow
'// リレーションを作るにはDataSetが必要
Dim ds As New DataSet
'// まとめる列のDataTable
Dim dtA As New DataTable
ds.Tables.Add(dtA)
dtA.Columns.Add("列1")
dtA.Columns.Add("rowspan")
row = dtA.NewRow
dtA.Rows.Add(row)
row("列1") = "A"
row("rowspan") = 2
row = dtA.NewRow
dtA.Rows.Add(row)
row("列1") = "B"
row("rowspan") = 2
'// 紐づく明細のDataTable
Dim dtB As New DataTable
ds.Tables.Add(dtB)
dtB.Columns.Add("列1")
dtB.Columns.Add("列2")
row = dtB.NewRow
dtB.Rows.Add(row)
row("列1") = "A"
row("列2") = "a"
row = dtB.NewRow
dtB.Rows.Add(row)
row("列1") = "A"
row("列2") = "b"
row = dtB.NewRow
dtB.Rows.Add(row)
row("列1") = "B"
row("列2") = "a"
row = dtB.NewRow
dtB.Rows.Add(row)
row("列1") = "B"
row("列2") = "b"
'// リレーションの作成
Dim rel As New DataRelation("relation", dtA.Columns("列1"), dtB.Columns("列1"))
ds.Relations.Add(rel)
'// まとめる列のDataTableのみ返せばよい
Return dtA
End Function
aspx側には2重構造のリピータを用意する。
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Default.aspx.vb" Inherits="rowspan._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head runat="server">
<title>rowspan</title>
<style type="text/css">
table, th, td { border: 1px solid blue; border-collapse: collapse; text-align: center; }
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="rptData" runat="server">
<HeaderTemplate>
<table>
<tr>
<th style="width:100px;">
列1</th>
<th style="width:100px;">
列2</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td rowspan="<%# Eval("rowspan") %>">
<%# Eval("列1") %>
</td>
<asp:Repeater ID="rptChild" runat="server" DataSource='<%# GetChildeData(Container.DataItem, "relation") %>'>
<ItemTemplate>
<%#IIf(Container.ItemIndex > 0, "<tr>", "")%>
<td>
<%# Eval("列2") %>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
外側のリピータにまとめる列で集計したデータ(dtA)をバインドし、内側のリピータのDataSourceには紐づく明細のデータをバインドする。
リレーション名から明細データを取得するためにGetChildeData関数を用意しておく。
'// リレーションに紐づくデータを取得
Protected Function GetChildeData( _
ByVal obj As Object, _
ByVal vsRelName As String _
) As Data.DataView
Return DirectCast(obj, Data.DataRowView).CreateChildView(vsRelName)
End Function
少々ややこしいが、コードおよびデザイン(aspx)はシンプルになると思う。
ただ、同じデータを2回クエリしなければならい負荷は考慮する必要がある。
ただ、同じデータを2回クエリしなければならい負荷は考慮する必要がある。
- Windowsドメインのパスワードで Linuxにもログインできるようにする。
(12.04) - Solaris標準のtarに注意!
(10.29) - 久しぶりに古いバージョンのJavaを利用して嵌りました
(10.23) - IIS7+PHPのファイルアップロードに注意
(10.17) - ネットワークブロードキャストに ping
(10.16) - VBScriptで改行コードを変換する!
(10.07) - 複数のexeで、単一のコンフィグファイルを共有する
(10.02) - Windows Server 2008では local Administratorのパスワードが有効期限切れになる
(09.30) - コマンドプロンプトでファイルの中身を比較してみよう!!
(09.25) - VirtualServer の仮想HDファイルをドライブとして参照(マウント)
(09.22)
- 2008年12月
- 2008年10月
- 2008年9月
- 2008年8月
- 2008年7月
- 2008年6月
- 2008年5月
- 2008年4月
- 2008年3月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年11月
- 2007年10月
- 2007年9月
- 2007年8月
- 2007年7月
- 2007年6月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
- 2007年1月
- 2006年12月
- 2006年11月
- 2006年10月
- 2006年9月
- 2006年8月
- 2006年7月
- 2006年6月
- 2006年5月
- 2006年4月
- 2006年3月
- 2006年2月
- 2006年1月
- 2005年12月
- 2005年11月
- 2005年10月
- 2005年9月
- 2005年8月
- 2005年7月
- 2005年6月
- 2005年5月
- 2005年4月
- 2005年3月
- 2005年2月
- 2004年12月
- 2004年11月
- 2004年10月
