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

ASP.NET 中使用嵌套 Repeater 的快速指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (38投票s)

2004年2月20日

CPOL

2分钟阅读

viewsIcon

498425

downloadIcon

4971

在 ASP.NET 中使用嵌套 Repeater 以及 XML 数据存储

引言

我一直不是一个纯粹的 Web 开发者,也从未觉得 Web 开发特别有趣。但不得不说,我至今为止所做的少量 ASP.NET 开发让我着迷,虽然坦白说,这并不多。我发现的一个特别有用的控件是 Repeater 控件,但当我尝试使用 XML 文件作为数据存储来实现嵌套 Repeater 时,遇到了一些困难。最终,解决方案出乎意料地简单,我想为那些可能遇到与我相同令人恼火情况的初学者写一篇文章。

致读者

我假设你已经知道如何使用 Repeater 控件。本文仅演示如何实现嵌套 Repeater,不会尝试解释 Repeater 的一般用法。

示例

我将演示一个简单的 ASP.NET Web 应用程序,它将使用 XML 文件作为输入数据来列出板球世界 XI 阵容。最终,修改球队只需更改 XML 文件,无需更改 aspx 页面或代码隐藏文件。

我的 XML 文件

基本上,我有四个类别——每个类别有一个或多个球员。

实现嵌套 Repeater

我将首先列出类别,然后在每个类别中列出该类别下的球员。首先,我们添加将列出类别的外部 Repeater。

现在,我们将内部 Repeater 添加到外部 Repeater 的 <ItemTemplate> 标签中。

编写代码隐藏代码

好吧,我知道“代码隐藏代码”听起来很奇怪,但我实在想不出更好的说法,如果有人有更好的想法,请与我联系。无论如何,我们像往常一样在 Page_Load 事件处理程序中设置第一个 Repeater。

private void Page_Load(object sender, System.EventArgs e)
{
    DataSet ds = new DataSet();
    ds.ReadXml(MapPath("./XMLFile1.xml"));
    CategoryRepeater.DataSource = ds;
    CategoryRepeater.DataBind();
}

为了设置外部 Repeater,我们处理 Repeater 类的 ItemDataBound 事件,该事件在数据绑定到项但尚未将其渲染到页面上之前引发。现在,我们使用 RepeaterItem.FindControl 获取对 PlayerRepeater 控件的引用,并使用 CreateChildView 和自动创建的关系——category_cricketer 来设置其数据源。顺便说一句,我对这一点印象深刻,我从未期望基于 XML 自动创建关系。我觉得这很酷!

private void CategoryRepeater_ItemDataBound(object sender, 
    System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    if( (item.ItemType == ListItemType.Item) ||
        (item.ItemType == ListItemType.AlternatingItem) )
    {
        PlayerRepeater = (Repeater) item.FindControl("PlayerRepeater");
        DataRowView drv = (DataRowView)item.DataItem;
        PlayerRepeater.DataSource = drv.CreateChildView("category_cricketer");
        PlayerRepeater.DataBind();
    }
}

就是这样。

输出

当我通过浏览器查看 Web 表单时,我得到了以下输出。

结论

欢迎随时提出反馈和批评。我也想感谢 Aravind Corera(来自钦奈的 C# MVP),他在我因沮丧而抓狂时,给了我正确的 URL 来解决这个问题。

© . All rights reserved.