完了日順に並べられたタスクのリストを作成するリピーターがあります。
<asp:Repeater ID="rptCompletedProjectTasks" OnItemDataBound="rptCompletedProjectTasks_ItemDataBound" runat="server">
<HeaderTemplate>
<h3>Completed Tasks</h3>
<table class="projTaskTable">
<tr>
<th style="width:100px">W/C</th>
<th style="width:450px">Description</th>
<th style="width:100px">Due</th>
<th style="width:100px">Completed</th>
<th style="width:50px">Var</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><asp:Label ID="lblWeek" runat="server" Text=''></asp:Label></td>
<td><%# Eval("description") %></td>
<td><%# Eval("deadline", "{0:d MMM yy}") %></td>
<td><asp:Label ID="lblCompleted" runat="server" Text='<%# Eval("completedDate", "{0:d MMM yy}") %>'></asp:Label></td>
<td><%# Eval("var") %></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
完了したタスクを週ごとに視覚的にグループ化し、タスクのグループの最初の行の左側の列に週の開始日を表示し、週が変更されるまで他の列には何も表示しないようにします。すなわち
前のアイテムのWeekCommencing値を確認し、OnItemDataBoundを使用して前の行の値と異なる場合にのみlblWeekコントロールを更新しようとしています。
protected void rptCompletedProjectTasks_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DateTime weekCommencing = new DateTime(1970, 1, 1);
if ((e.Item.ItemType != ListItemType.Header) && (e.Item.ItemType != ListItemType.Footer))
{
Label completedDate = e.Item.FindControl("lblCompleted") as Label;
Label lblWeekCommencing = e.Item.FindControl("lblWeek") as Label;
DateTime completed = Convert.ToDateTime(completedDate.Text);
if (completed != weekCommencing)
{
lblWeekCommencing.Text = getWeekCommencing(completed).ToString("d MMM");
}
else
{
lblWeekCommencing.Text = "";
}
weekCommencing = completed;
}
週の開始日を取得するために使用している関数は次のとおりです。
protected DateTime getWeekCommencing(DateTime date)
{
int delta = DayOfWeek.Monday - date.DayOfWeek;
DateTime monday = date.AddDays(delta);
return monday;
}