Nick Kahn
Nick Kahn

Reputation: 20078

Displaying data in Repeater FooterTemplate

Update:

row is null

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:

how to show data in repeater footer?...

its very silly that i have spent good amount of time figuring out but if i move the same to itemtemplate then its showing but not in footer...below is my code..

<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>

code-behind:

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

Upvotes: 2

Views: 22932

Answers (3)

Imran Rizvi
Imran Rizvi

Reputation: 7438

FooterTemplate is not rendered with each row , thus you cannot bind Comment of a DateItem to footer like this.

It seems that there would be only one Date Checked that you want to show in the footer.

You are looking DateChecked in DataItem that could be different for each row.

If all rows contain same DateChecked you can create a server side property to store it , you can use any rows Datechecked if all are same if not , you can store whichever date you want to show in footer (it should be any one date) Use following block in footer to show the DateChecked <% = PropertyName %> OR As you already placed Label in footer, you can directly bind lblDateTime from server side using this property.

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

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

To Bind Repeater in Footer Control

 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

To Bind Repeater in Footer Control

 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();
  }
} 

Upvotes: 3

SouthShoreAK
SouthShoreAK

Reputation: 4296

The footer is only rendered once for the entire dataset, while the item templates is rendered for every item in the collection.

EDIT

Repeater renders like so:

Header

ItemTemplate

ItemTemplate

... (one item template for each item in the datasource)

ItemTemplate

ItemTemplate

Footer

If you want something to appear in the footer of each row, you just need to add that markup to your 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>

END EDIT

You could probably override the ItemDataBound or DataBound event, and access your footer there if you need to set a value.

Modified from 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 */;
      }
   } 

Upvotes: 3

Adrian Iftode
Adrian Iftode

Reputation: 15663

The FooterTemplate is not bound to data items. When the repeater is built, the controls inside the FooterTemplate don't bind so the data bound expressions are not evaluated.

What you can do is to use the FindControl method.

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

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

You see, I'm calling the First() method to obtain a single item, this is because there is only one rendered Footer and this why I'm saying that this template is not for the items.

Upvotes: 1

Related Questions