结合NBearDataSource实现嵌套Repeater
参考资源:
1. 在Repeater中嵌套使用Repeater
2. How To Display Hierarchical Data by Using Nested Repeater Controls and Visual C# .NET
3. 嵌套的Repeater
4. 在嵌套的repeater中加ItemDataBound事件
5. [CN.Text开发笔记]嵌套Repeater的问题
6. repeater中嵌套repeater(vs2005)
7. Repeater嵌套的两种方案
8. Scott Mitchell 的ASP.NET 2.0数据教程之三十二:: 数据控件的嵌套
最组效果图:

方案一:每次绑定生成NBearDataSource,在ItemDataBound中设置NBearDataSource.Filter().
代码如下:

设计代码

<%
@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
<nb:NBearDataSource ID="nbdsLinkCategorys" runat="server" ConnectionStringName="Access"
TypeName="Entities.LinkCategory"></nb:NBearDataSource>
<asp:Repeater ID="rptLinkCategories" DataSourceID="nbdsLinkCategorys" runat="server" OnItemDataBound="rptLinkCategories_ItemDataBound">
<ItemTemplate>
<div class="box">

<h3><%
#Eval("Name") %></h3>
<ul><nb:NBearDataSource ID="nbdsLinks" runat="server" ConnectionStringName="Access"
TypeName="Entities.Link" />
<asp:Repeater ID="rptLinks" DataSourceID="nbdsLinks" runat="server">
<ItemTemplate>
<li>
<a href='<%#Eval("Src") %>'

runat="server" title='<%
#"点击查看 - " + Eval("Title") %>'><%
#Eval("Title") %></a>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</div>
</ItemTemplate>
</asp:Repeater>

源代码
protected void rptLinkCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)

{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)

{
LinkCategory category = (LinkCategory)e.Item.DataItem;
NBearDataSource nbds = (NBearDataSource)e.Item.FindControl("nbdsLinks");
nbds.Filter(Link._.CategoryID == category.ID);
}
}
缺点:如果有N个Linkcategory,这个方法会访问数据库N+1次— 一次返回所有的Linkcategory,N次返回特定Linkcategory下的Links。
方案二:只需两次数据访问,一次获取全部的LinkCategories,一次获取全部的Links。
1. 在Repeater中嵌套使用Repeater
2. How To Display Hierarchical Data by Using Nested Repeater Controls and Visual C# .NET
3. 嵌套的Repeater
4. 在嵌套的repeater中加ItemDataBound事件
5. [CN.Text开发笔记]嵌套Repeater的问题
6. repeater中嵌套repeater(vs2005)
7. Repeater嵌套的两种方案
8. Scott Mitchell 的ASP.NET 2.0数据教程之三十二:: 数据控件的嵌套
最组效果图:

方案一:每次绑定生成NBearDataSource,在ItemDataBound中设置NBearDataSource.Filter().
代码如下:

<%
@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
<nb:NBearDataSource ID="nbdsLinkCategorys" runat="server" ConnectionStringName="Access"
TypeName="Entities.LinkCategory"></nb:NBearDataSource>
<asp:Repeater ID="rptLinkCategories" DataSourceID="nbdsLinkCategorys" runat="server" OnItemDataBound="rptLinkCategories_ItemDataBound">
<ItemTemplate>
<div class="box">
<h3><%
#Eval("Name") %></h3>
<ul><nb:NBearDataSource ID="nbdsLinks" runat="server" ConnectionStringName="Access"
TypeName="Entities.Link" />
<asp:Repeater ID="rptLinks" DataSourceID="nbdsLinks" runat="server">
<ItemTemplate>
<li>
<a href='<%#Eval("Src") %>' 
runat="server" title='<%
#"点击查看 - " + Eval("Title") %>'><%
#Eval("Title") %></a>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</div>
</ItemTemplate>
</asp:Repeater>
protected void rptLinkCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
LinkCategory category = (LinkCategory)e.Item.DataItem;
NBearDataSource nbds = (NBearDataSource)e.Item.FindControl("nbdsLinks");
nbds.Filter(Link._.CategoryID == category.ID);
}
}缺点:如果有N个Linkcategory,这个方法会访问数据库N+1次— 一次返回所有的Linkcategory,N次返回特定Linkcategory下的Links。
方案二:只需两次数据访问,一次获取全部的LinkCategories,一次获取全部的Links。


