在运行时切换Repeater的ItemTemplate

时间:2009-04-08 02:04:21

标签: asp.net

是否可以为Repeater的ItemTemplate定义多个模板,并根据某些条件在它们之间切换?

我使用转发器查看帖子列表,但希望对属于当前用户的行有不同的视图(例如,包含用于删除帖子的LinkBut​​ton)

如果无法做到这一点,那么可以在Repeater的ItemTemplate中使用Multiview控件吗?

2 个答案:

答案 0 :(得分:2)

我尝试在ItemTemplate中使用MultiView控件,它运行得很好,希望这可以帮助有同样问题的人:

<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
  <ItemTemplate>
    <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="<%# ((Post)Container.DataItem).Member.ID == CurrentMemberID ? 1 : 0 %>">
      <asp:View ID="View1" runat="server"><!-- some links --></asp:View>
      <asp:View ID="View2" runat="server"><asp:LinkButton CommandName="DeletePost" CommandArgument="<%# ((Post)Container.DataItem).Id %>" ID="LinkButton1" runat="server">Delete Post</asp:LinkButton></asp:View>
    </asp:MultiView>
  </ItemTemplate>
</asp:Repeater>

答案 1 :(得分:0)

我不知道是否可以在模板之间切换,但我发现Repeater.OnItemDataBound事件对修改单个转发器项目的显示最有用。

例如,要显示基于当前用户的链接按钮...

protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   LinkButton = e.Item.FindControl("btnDelete");
   LinkButton.Visible = (e.Item.DataItem as DataRow)["CreatedBy"] == getCurrentUser();
}

通常,我保持每个转发器项的数据布局一致,并通过更改模板中控件的CssStyle和Visible属性来修改视觉外观。如果有更多激进的布局更改,我会将每个布局选项放在占位符中,并使用逻辑来确定要显示的占位符。