首先,很抱歉细节很长。但它必须描述我的问题。每件事都是自我解释的,不是那么难以阅读。谢谢!
我有班级中的对象列表。 List<CalendarEvent> allCalendarEvents = GetEvents();
public class CalendarEvent
{
public int id { get; set; }
public ID itemId { get; set; }
public DateTime start { get; set; }
public DateTime end { get; set; }
public string subject { get; set; }
}
现在,我希望按allCalendarEvents
日期对列表start
中的事件进行分组。所以我使用了这段代码:
var monthList = from e in allCalendarEvents
group e by e.start.Month into g
orderby g.Key
select new { month = g.Key, Event = g };
列表中的所有项目现在按月分组。到现在为止还挺好。我使用ASP Repeater向用户显示数据。
<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound">
<ItemTemplate>
<li>
<%# Eval("month") %>
代码背后
repMonths.DataSource = monthList;
repMonths.DataBind();
我可以看到月份编号作为我的数据的输出,例如对于5月,6月,7月的活动,我看到了:
5
6
7
现在我想向用户展示一个月内一组中有多少个CalenderEvents。如果我使用repMonths
内的另一个转发器,如下所示:
<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound">
<ItemTemplate>
<li>
<%# Eval("month") %>
<asp:Repeater runat="server" ID="repInnerEvent">
<ItemTemplate>
<li>
<asp:Label runat="server" ID="lblEventName"></asp:Label>
</li>
</ItemTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>
然后我不知道如何将数据绑定到内部转发器。 E.g。
protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
var item = e.Item.DataItem as ???; // I don't know what will come here
}
答案 0 :(得分:2)
您需要做的第一件事就是找到内部中继器。你走在正确的轨道上。在转发器项目上使用FindControl()
进行查找。一旦你拥有它,只需简单地分配数据源并绑定它。
protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
// We only care if the repeater item is part of the <ItemTemplate>
if(e.Item.ItemType == ListItemType.Item)
{
Repeater repInnerEvent = (Repeater)e.Item.FindControl("repInnerEvent");
repInnerEvent.DataSource = // your data source
repInnerEvent.DataBind();
}
}
听起来问题实际上并不是如何绑定的。它是如何获取数据绑定。在这种情况下,您已经编写了查询。你只需知道这个月。在这种情况下,我会使用一个标签来保存月份。
<asp:Repeater runat="server" ID="repMonths" OnItemDataBound="repMonths_OnItemDataBound">
<ItemTemplate>
<li>
<asp:Label ID="lblMonth" runat="server" Text='<%# Eval("month") %>'></asp:Label>
<asp:Repeater runat="server" ID="repInnerEvent">
<ItemTemplate>
<li>
<asp:Label runat="server" ID="lblEventName"></asp:Label>
</li>
</ItemTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>
然后在ItemDataBound
中,获取该标签并使用其值。
protected void repMonths_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
// We only care if the repeater item is part of the <ItemTemplate>
if(e.Item.ItemType == ListItemType.Item)
{
// Get the month
Label lblMonth = (Label)e.Item.FindControl("lblMonth");
// Get the events for the month
var eventList = from e in allCalendarEvents
where e.start.Month == lblMonth.Text
select e;
// Bind your events to the inner repeater
Repeater repInnerEvent = (Repeater)e.Item.FindControl("repInnerEvent");
repInnerEvent.DataSource = eventList
repInnerEvent.DataBind();
}
}