如何将Repeater与对象列表GroupBy绑定

时间:2015-10-02 13:06:48

标签: c# asp.net

首先,很抱歉细节很长。但它必须描述我的问题。每件事都是自我解释的,不是那么难以阅读。谢谢!

我有班级中的对象列表。 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
}

1 个答案:

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