多字段分组重复器






3.31/5 (6投票s)
2005年6月22日
4分钟阅读

170855

2006
可以按多个数据库字段分组的数据中继器。
引言
在我长久地寻找一个能完全满足我需求的 Repeater 控件,却一无所获之后,我做了任何一个时间充裕且囊中羞涩的开发者都会做的事——我用自己的双手创造了一个。
背景
真正促使我开始这个项目的是 Rob van der Veer 的文章 “A Grouping Repeater Control for ASP.NET”。我以他的 GroupingRepeater
代码作为我自身代码的起点。谢谢你,Rob!
问题所在
我发现,在大多数情况下,我都需要一个 Repeater 控件,它能够处理由带有多个 join
语句的查询返回的数据库结果。我们都知道,一个 join
语句会产生重复的信息。虽然 Rob 的文章是一个很好的起点,但他的控件有一个主要缺陷:如果存在不止一个“类别”的唯一重复数据该怎么办?
解决方案
为了能够实现这类功能,这个控件要复杂得多。它的工作原理是这样的:不是只有一个 GroupTemplate
,而是根据需要有任意多个。通过查看模板示例,可以很好地解释这一点。
注意:由于与本页面的渲染方式冲突,“HeaderTemplate
”和“ItemTemplate
”标签的大小写或间距可能不正确。
<uc1:GroupingRepeater ID="Items" Runat="Server">
<headerTemplate>
<table>
<tr>
<td>Customer Name</td>
<td>Order History</td>
<td>Comments</td>
</tr>
</headerTemplate>
< itemTemplate>
<tr>
<td><%# DataBinder.Eval(Container.DataItem,
"CustomerName") %></td>
<td>
<%# ((GroupingRepeater)Container.Parent).GroupData("OrderHistory")%>
</td>
<td>
<%# ((GroupingRepeater)Container.Parent).GroupData("Comments") %>
</td>
</tr>
< itemTemplate>
<GroupTemplate>
<div>
<%# DataBinder.Eval(Container.DataItem, "OrderDate") %> -
<%# DataBinder.Eval(Container.DataItem, "OrderID") %>:
$<%# DataBinder.Eval(Container.DataItem, "OrderAmount") %>
</div>
</GroupTemplate>
<GroupTemplate>
<div>Posted by
<%# DataBinder.Eval(Container.DataItem, "EmployeeName") %> on
<%# DataBinder.Eval(Container.DataItem, "CommentPostedDate") %>:
<%# DataBinder.Eval(Container.DataItem, "Comment") %>
</div>
</GroupTemplate>
<GroupIdentifier Index="-1" Key="ItemTemplate" Field="ID" />
<GroupIdentifier Index="0" Key="OrderHistory" Field="OrderID" />
<GroupIdentifier Index="1" Key="Comments" Field="CommentID" />
<SeparatorTemplate><tr><td
colspan="3"> </td></tr></SeparatorTemplate>
<SeparatorTemplate><hr></SeparatorTemplate>
<SeparatorIdentifier Index="0" Key="ItemTemplate" />
<SeparatorIdentifier Index="1" Key="Comments" />
<FooterTemplate></table></FooterTemplate>
</uc1:GroupingRepeater>
现在,一些解释
既然您已经看过示例,现在我将解释如何设置您的模板代码。
模板
HeaderTemplate, FooterTemplate
这些模板在标准 ASP.NET Repeater
中的工作方式与此处相同。
AlternatingItemTemplate
此模板在此代码版本中不受支持。抱歉,我偷懒了!
ItemTemplate
此模板的工作方式基本上与标准 ASP.NET Repeater
中的 ItemTemplate
相同。例外情况是,您必须识别出将包含分组项目的区域。您可以通过使用以下代码来实现此目的
<%# ((GroupingRepeater)Container.Parent).GroupData("GroupKey") %>
“GroupKey
”应替换为您在相应的 GroupIdentifier
中为此组分配的任何键,我将在下面解释。
GroupTemplate
使用这些模板来设置您的各种组。这些模板的使用方式与任何 ITemplate
属性相同,只是您可以拥有任意多个。
SeparatorTemplate
如果需要,您可以指定一个 SeparatorTemplate
,用于放置在 ItemTemplate
项目之间,以及您任意数量的 GroupTemplate
之间。如果为 ItemTemplate
或 GroupTemplate
指定了 SeparatorTemplate
,它将自动放置在每个项目之间。
标识符
TemplateIdentifier
控件允许 GroupingRepeater
通过将开发者友好的“键”与模板的索引位置相关联来实现多模板。
GroupIdentifier
GroupIdentifier
模板用于关联和标识在何处使用哪个 GroupTemplate
。例如
<GroupIdentifier Index="1" Key="Comments"
Field="CommentID" EmptyGroupDataText="(No Comments)" />
此 TemplateIdentifier
将标识一个 GroupTemplate
,它将由键“Comments
”引用,并且是中继器控件中列出的第二个 GroupTemplate
(“Index
”是零基的)。“Field
”属性指定 DataSource
的哪个字段决定何时创建新的组项目。如果此字段的值已存在于组项目中,则该行将被跳过。“EmptyGroupDataText
”属性指定在没有数据可显示的情况下应呈现的文本。如果未指定此属性,则在这种情况下不显示任何内容。
注意:您必须有一个 GroupIdentifier
,其 Index
属性设置为“-1”,并且其 Key
属性设置为“ItemTemplate
”。此标识符的 Field
属性决定何时创建新的 ItemTemplate
项目。
注意:您必须为指定的每个 GroupTemplate
指定一个 GroupIdentifier
!
SeparatorIdentifier
SeparatorIdentifer
的工作方式与 GroupIdentifer
非常相似,只是不显示 Field
和 EmptyGroupDataText
属性。与 GroupIdentifier
一样,您必须为指定的每个 SeparatorTemplate
指定一个 SeparatorIdentifier
。但是,您不必为 ItemTemplate
指定 SeparatorIdentifier
。
差不多就这些了!
我希望您觉得它很有用。请注意,我并未进行任何非常详尽的调试,但随着我自己的调整,我将更新代码。祝您好运,玩得开心!
天哪,更新了!
2006年2月9日
许多人在评论中要求提供一个可用的演示。好了,有求必应——演示现在可以在页面顶部的下载部分找到。它看起来不太漂亮,但应该能让您对它的工作原理及其能力有一个很好的了解。此外,我在源代码下载中添加了一个完整的 C#.NET 项目,包括编译后的二进制文件。尽情享用吧!