列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月