首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌套重复器正确显示父项和子项

使用嵌套重复器正确显示父项和子项
EN

Stack Overflow用户
提问于 2015-05-05 13:47:11
回答 2查看 1.2K关注 0票数 2

在塞托雷,我有以下结构:

  • 欧洲
    • 德国
    • 法国
    • 瑞典

  • 亚洲
    • 中国
    • 泰国

  • 中东
    • U.A.E
    • 伊朗

我使用嵌套中继器在Asp.net中显示这种结构。

代码语言:javascript
复制
<asp:Repeater runat="server" ID="repSubsidiaryList">
<ItemTemplate>
<li>
 <%# Helper.Field(Container.DataItem as Item, "Short Title)%> 
   <asp:Repeater ID="InnerRepeater" runat="server">
     <ItemTemplate>
       <li>
        <%# Helper.Field(Container.DataItem as Item, "Name")%>
       </li>
      </ItemTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>

下面是“守则”:

代码语言:javascript
复制
List<Item> _countryNameItems = new List<Item>(); 
protected void Page_Load(object sender, EventArgs e)
{
    //get the item Subsidaries in sitecore 
    Item mainSubsidiaryFolderItem = Sitecore.Context.Database.GetItem(Settings.GetSetting("SubsidariesFolder"));

    _countryNameItems = mainSubsidiaryFolderItem.Axes.GetDescendants().Where(p => p.TemplateName == "Subsidiary").ToList();

    // binding Subsidiary Folder to a repeater
    repSubsidiaryList.DataSource = mainSubsidiaryFolderItem.GetChildren();
    repSubsidiaryList.DataBind();
}

private void repSubsidiaryList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    InnerRepeater = (Repeater) item.FindControl("InnerRepeater");
    InnerRepeater.DataSource = _countryNameItems;
    InnerRepeater.DataBind();
}

我得到的结果如下:

  • 欧洲
    • 德国
    • 法国
    • 瑞典
    • 中国
    • 泰国
    • U.A.E
    • 伊朗

  • 亚洲
    • 德国
    • 法国
    • 瑞典
    • 中国
    • 泰国
    • U.A.E
    • 伊朗

  • 中东
    • 德国
    • 法国
    • 瑞典
    • 中国
    • 泰国
    • U.A.E
    • 伊朗

我不知道如何获取currentItem,然后绑定数据.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-05 14:03:44

您的内部中继器始终是_countryNameItems的数据源。用此方法替换ItemDataBound方法应该会有所帮助:

代码语言:javascript
复制
private void repSubsidiaryList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
   // Cast the current dataitem to a Sitecore item
   Item item = (Item)e.Item.DataItem; 
   Repeater innerRpt = (Repeater) e.Item.FindControl("InnerRepeater");      
   // bind the inner repeater to the children of the sitecore item
   innerRpt.DataSource = item.Children; 
   innerRpt.DataBind();
}
票数 3
EN

Stack Overflow用户

发布于 2015-05-05 14:18:05

我并不是很有经验,但你基本上是在做错事。

您正在为每个中继器设置相同的List<Item>,即_countryNameItems。因此,理想情况下,您需要在List<Item>中提取不同的ItemDatabound。你可以试试这样的东西

标记(将上面的行更改为innerRepeater,如下所示)

代码语言:javascript
复制
<asp:Label ID="parentGroupLabel" runat="server" 
        Text='<%# Helper.Field(Container.DataItem as Item, "Short Title")%>'>
</asp:Label>

代码隐藏

代码语言:javascript
复制
protected void repSubsidiaryList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    var templateName = (Label) item.FindControl("parentGroupLabel");
    var InnerRepeater = (Repeater) item.FindControl("InnerRepeater");
    _countryNameItems = mainSubsidiaryFolderItem.Axes.GetDescendants().Where(p => p.TemplateName == templateName.Text).ToList();
    InnerRepeater.DataSource = _countryNameItems;
    InnerRepeater.DataBind();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30054828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档