ASP.NET WebForms嵌套转发器与LINQ组数据源

时间:2014-12-11 21:23:14

标签: c# html asp.net webforms servercontrols

我有一个LINQ分组,我想用它来填充父级和子级转发器控件。

<asp:Repeater ID="Parent" runat="server" OnItemDataBound="Parent_ItemDataBound">
    <ItemTemplate>
        <%# Eval("Key") %>
        <asp:Repeater ID="Child" runat="server">
            <ItemTemplate>
                <%# Eval("Id")  %>
                <%# Eval("Name")  %>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

public class Dog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Breed { get; set; }
}

private IEnumerable<IGrouping<string, Dog>> GetDogs()
{
    var dogs = new List<Dog>
    {
        new Dog
        {
            Id = 1,
            Name = "Rex",
            Breed = "Poodle",
        },
        new Dog
        {
            Id = 2,
            Name = "Fido",
            Breed = "Terrier",
        },
        new Dog
        {
            Id = 3,
            Name = "Killer",
            Breed = "Pit Bull",
        }
    };

    return dogs.GroupBy(_ => _.Breed);
}

protected void Page_Load(object sender, EventArgs e)
{
    Parent.DataSource = GetDogs();
    Parent.DataBind();
}

protected void Parent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var item = e.Item;
    if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem))
    {
        var repeater = (Repeater)item.FindControl("Child");

        // I'm stuck on this code...
        //repeater.DataSource = what to do?
        //repeater.DataBind();
    }
}

我试图在Parent_ItemDataBound事件中设置子转发器的数据源。我该怎么做呢? item.DataItem是类型对象,我无法弄清楚如何获取数据项中的狗列表。

2 个答案:

答案 0 :(得分:5)

扩大约书亚的正确答案。如果您可以使用4.5运行时,则可以在转发器本身上声明类型,这样您就不必绑定ItemDataBound事件。

<ul>
    <asp:Repeater runat="server" ID="Parent" ItemType="IGrouping<String, Dog>">
        <ItemTemplate>
            <li><%# Item.Key %><ul>
            <asp:Repeater runat="server" ID="Child" ItemType="Dog" DataSource="<%#Item%>">
                <ItemTemplate>
                    <li><%# Item.Id %></li>
                    <li><%# Item.Name %></li>
                </ItemTemplate>
            </asp:Repeater>
            </ul></li>
        </ItemTemplate>
    </asp:Repeater>
</ul>

答案 1 :(得分:2)

您可以从e.Item.DataItem获取数据。您应该能够将其转换为IGrouping。然后,您可以通过查找当前中继器repeateritem中的控件来获取内部中继器。然后将DataItem中的数据绑定到嵌套的转发器。

以下代码应该有效。

所有这些假设您不会将嵌套转发器包装在其他控件中。

    protected void Parent_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        var item = e.Item.DataItem as IGrouping<string, Dog>;
        if (item == null)
            return;

        if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
        {
            var repeater = e.Item.FindControl("Child") as Repeater;

            if (repeater != null)
            {
                repeater.DataSource = item;
                repeater.DataBind();
            }
        }
    }