65.9K
CodeProject 正在变化。 阅读更多。
Home

多字段分组重复器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.31/5 (6投票s)

2005年6月22日

4分钟阅读

viewsIcon

170855

downloadIcon

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 之间。如果为 ItemTemplateGroupTemplate 指定了 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 非常相似,只是不显示 FieldEmptyGroupDataText 属性。与 GroupIdentifier 一样,您必须为指定的每个 SeparatorTemplate 指定一个 SeparatorIdentifier。但是,您不必ItemTemplate 指定 SeparatorIdentifier

差不多就这些了!

我希望您觉得它很有用。请注意,我并未进行任何非常详尽的调试,但随着我自己的调整,我将更新代码。祝您好运,玩得开心!

天哪,更新了!

2006年2月9日

许多人在评论中要求提供一个可用的演示。好了,有求必应——演示现在可以在页面顶部的下载部分找到。它看起来不太漂亮,但应该能让您对它的工作原理及其能力有一个很好的了解。此外,我在源代码下载中添加了一个完整的 C#.NET 项目,包括编译后的二进制文件。尽情享用吧!

© . All rights reserved.