代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

ASP.NET:如何更改<asp:repeater>中每行使用的项模板?

  •  4
  • Ian Boyd  · 技术社区  · 16 年前

    现有的 代码正在使用 asp:repeater 创建HTML表。(强调现有设计)。这是生成表的部分伪代码:

    <asp:repeater OnItemDataBound="ItemDataBound" ... >
    
       <headertemplate>
          <table>
             <thead>
                <tr>
                   <td>Date</td>
                   <td>Type</td>
                   <td>Action</td>
                </tr>
             </thread>
       </headertemplate>
    
       <itemtemplate>
          <tr>
             <td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
             <td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
             <td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
          </tr>
       </itemtemplate>
    
       <footertemplate>
             </tbody>
          </table>
       </footertemplate>
    
    </asp:repeater>
    

    但现在需要(某些)项显示不同,并且需要使用 COLSPAN=3 ,整个项目将是一个单元格:

       <itemtemplate>
          <tr>
             <td colspan="3">
                <img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
                <a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
             </td>
          </tr>
       </itemtemplate>
    

    鉴于:

    • 页面使用转发器构建HTML表
    • 设计需要一些表行跨列

    我该怎么做?

    我是 希望 比如:

       <itemtemplate id="thisThatTheOtherItemTemplate">
          <tr>
             <td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
             <td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
             <td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
          </tr>
       </itemtemplate>
    
    
       <itemtemplate id="fooItemTemplate">
          <tr>
             <td colspan="3">
                <img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
                <a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
             </td>
          </tr>
       </itemtemplate>
    

    并且神奇地能够让Ondatabind事件告诉中继器使用哪个模板。这有可能吗?

    回答

    虽然这两个答案都是正确的,但我宁愿使用第一个建议;它涉及在ASPX文件中显示代码,而不是在代码隐藏中手动构建HTML。(我不想再在代码中构建HTML)

       <itemtemplate>
          <asp:PlaceHolder ID="thing1" runat="server">
             <tr>
                <td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
                <td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
                <td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
             </tr>
          </asp:PlaceHolder>
    
          <asp:PlaceHolder ID="thing2" visible="false" runat="server">
             <tr>
                <td colspan="3">
                   <img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
                   <a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
                </td>
             </tr>
       </itemtemplate>
    

    在后面的代码中:

    protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
       // if the data bound item is an item or alternating item (not the header etc)
       if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
       {
          // get the associated object
          Object item = .Item.DataItem;
          if (item == null)
             return;
    
          Control thing1 = e.Item.FindControl("thing1");
          Control thing2 = e.Item.FindControl("thing2");
    
          if (item is MyClassThatICreated)
          {
             thing1.Visible = false;
             thing2.Visible = true;
          }
          else
          {
             thing1.Visible = true;
             thing2.Visible = false;
          }
          ...
    }
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   FlySwat    16 年前

    在项目模板中放置两个ASP:Placeholder控件。在codebehind中,在itemdatabound事件上,确定要显示的样式,并隐藏一个占位符。

        2
  •  3
  •   Mitchel Sellers    16 年前

    乔纳森的建议的另一个替代方法是在itemdatabound事件的后端动态地构建项目,有些人发现这更容易使用,而不是切换可见性。

    在这种情况下,我个人只需要输入一个文本,并在后端构建模式为“passthrough”。