在Repeater FooterTemplate中显示数据

时间:2012-04-12 14:08:13

标签: asp.net repeater

更新

行为空

if (e.Item.ItemType == ListItemType.Footer)
{
 Label lblDateCreated = e.Item.FindControl("lblDateCreated ") as Label;
 DataRowView row = (DataRowView)e.Item.DataItem; //row is null here <<<<
 lblDateCreated .Text = row["DateChecked"].ToString();

}

END UPDATE:

如何在转发器页脚中显示数据?...

非常愚蠢,我花了很多时间搞清楚,但如果我移动相同的itemtemplate然后它的显示但不在页脚...下面是我的代码..

<asp:Repeater ID="rpt" runat="server">
        <HeaderTemplate>
            header...
        </HeaderTemplate>
        <ItemTemplate>
            <div class="rpt">
                <div class="inner">
                    <div>
                        <div class="ert">
                            <%#DataBinder.Eval(Container.DataItem, "Comment")%>
                        </div>
                    </div>
                </div>
            </div>
            <br />
        </ItemTemplate>
        <FooterTemplate>
            footer.....
            <div id="datetime">
            <asp:Label ID="lblDateTime" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label>
            </div>
            <div id="save">
            <p>
                <asp:HyperLink ID="Hyperlink2" runat="server" NavigateUrl="~/link.aspx"
                    Text="More"></asp:HyperLink></p>
            </div>
         </FooterTemplate>
    </asp:Repeater>

代码隐藏:

rpt.DataSource = mydatasource;
rpt.DataBind();

3 个答案:

答案 0 :(得分:3)

不会为每一行呈现FooterTemplate,因此您无法将DateItem的注释绑定到这样的页脚。

似乎只有一个Date Checked要在页脚中显示。

您正在寻找DataItem中的DateChecked,每行可能有所不同。

如果所有行都包含相同的DateChecked,你可以创建一个服务器端属性来存储它,你可以使用任何行Datechecked如果所有都相同,你可以存储你想在页脚中显示的任何日期(它应该是任何一个)日期) 在页脚中使用以下块来显示DateChecked     &lt;%= PropertyName%&gt; 要么 由于您已将Label放置在页脚中,因此可以使用此属性直接从服务器端绑定lblDateTime。

rpt.DataSource = mydatasource;
rpt.DataBind();

var lblDateTime = rpt.FindControl("lblDateTime") as Label;
if (lblDateTime != null)
{
   lblDateTime.Text = mydatasource.First().DateChecked;
}

在页脚控件中绑定中继器

 void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

  // This event is raised for the header, the footer, separators, and items.

  // Execute the following logic for Footer only.
  if (e.Item.ItemType == ListItemType.Footer) {

        footerRepeater.DataSource = mydatasource;
        footerRepeater.DataBind();
  }
 } 

ASPX

<asp:Repeater ID="rpt" runat="server">
    <HeaderTemplate>
        header...
    </HeaderTemplate>
    <ItemTemplate>
        <div class="rpt">
            <div class="inner">
                <div>
                    <div class="ert">
                        <%#DataBinder.Eval(Container.DataItem, "Comment")%>
                    </div>
                </div>
            </div>
        </div>
        <br />
    </ItemTemplate>
    <FooterTemplate>
        footer.....
       <asp:Repeater ID="rpt" runat="server">
         <ItemTemplate>
           <div>
              <asp:Label ID="lblDateTime" runat="server" DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label>
          </div>
        </ItemTemplate>
       </asp:Repeater>
     </FooterTemplate>
 </asp:Repeater>

CS

在页脚控件中绑定中继器

 void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

  // This event is raised for the header, the footer, separators, and items.

  // Execute the following logic for Footer only.
  if (e.Item.ItemType == ListItemType.Footer) {

        footerRepeater.DataSource = mydatasource;
        footerRepeater.DataBind();
  }
} 

答案 1 :(得分:3)

页脚仅为整个数据集呈现一次,而为集合中的每个项目呈现项目模板。

修改

Repeater呈现如下:

标题

的ItemTemplate

的ItemTemplate

...(数据源中每个项目的一个项目模板)

的ItemTemplate

的ItemTemplate

页脚

如果您想在每行的页脚中显示某些内容,只需将该标记添加到ItemTemplate

    <ItemTemplate>
        <div class="rpt">
            <div class="inner">
                <div>
                    <div class="ert">
                        <%#DataBinder.Eval(Container.DataItem, "Comment")%>
                    </div>
                </div>
            </div>
        </div>
        <br />
        <div class="footer">
            footer.....
            <div id="datetime">
                <asp:Label ID="lblDateTime" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label>
            </div>
        </div>
    </ItemTemplate>

结束编辑

您可以覆盖ItemDataBound或DataBound事件,并在需要设置值时访问其页脚。

MSDN修改

   void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

      // This event is raised for the header, the footer, separators, and items.

      // Execute the following logic for Footer only.
      if (e.Item.ItemType == ListItemType.Footer) {

            ((Label)e.Item.FindControl("lblDateTime")).Text= /* your value */;
      }
   } 

答案 2 :(得分:1)

FooterTemplate 未绑定到数据项。构建转发器时, FooterTemplate 中的控件不会绑定,因此不会计算数据绑定表达式。

您可以使用FindControl方法。

rpt.DataSource = mydatasource;
rpt.DataBind();

var lblDateTime = rpt.FindControl("lblDateTime") as Label;
if (lblDateTime != null)
{
   lblDateTime.Text = mydatasource.First().DateChecked;
}

你看,我正在调用First()方法来获取单个项目,这是因为只有一个渲染的页脚,这就是为什么我说这个模板不适用于项目。