Reputation: 20078
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
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
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
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