0

Repeater in Repeater is the answer to my question.

However, I am confused by childRepeater.DataSource = ...; as I need to use a method to get the data, and the method uses an argument parent ID. I don't understand how I get the value of the parent ID - the outer repeater's ID.

I looked at a few other examples but no answer that works...

Community
  • 1
  • 1
Dejan Biljecki
  • 595
  • 1
  • 5
  • 26

2 Answers2

2

Using the referenced answer it will be something like this, just check for nulls of course.

protected void ItemBound(object sender, RepeaterItemEventArgs args)
    {
        if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem)
        {
            Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater");
            Repeater parentRepeater = (Repeater)args.Item.FindControl("ParentRepeater");       
            childRepeater.DataSource = YourMethod(parentRepeater.ID);
            childRepeater.DataBind();
        }
    }
cvetyab
  • 103
  • 7
  • How can you find **ParentRepeater** inside **ParentRepeater**'s ***ItemBound***? – Win Aug 30 '13 at 20:37
  • **Good guess - childRepeater.Parent.ID won't work.** There are multiple ways of accessing ParentID such as using HiddenField. – Win Aug 30 '13 at 20:51
1

enter image description here

<asp:Repeater ID="ParentRepeater" runat="server"    
   OnItemDataBound="ParentRepeater_ItemDataBound">
    <ItemTemplate>
        <strong>Parent</strong>
        <asp:Label runat="server" ID="FirstNameLabel" 
        Text='<%# Eval("FirstName") %>' />
        <asp:Label runat="server" ID="LastNameLabel" 
        Text='<%# Eval("LastName") %>' />
        <br/>
        <!-- Repeated data -->
        <asp:Repeater ID="ChildRepeater" runat="server">
            <ItemTemplate>
                <!-- Nested repeated data -->
                <strong>Children</strong>
                <asp:Label runat="server" ID="FirstNameLabel" 
                Text='<%# Eval("FirstName") %>' />
                <asp:Label runat="server" ID="LastNameLabel" 
                Text='<%# Eval("LastName") %>' /><br/>
            </ItemTemplate>
        </asp:Repeater>
        <hr/>
    </ItemTemplate>
</asp:Repeater>

public class User
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public List<User> Children;

    public User()
    {
        Children = new List<User>();
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var users = new List<User>
        {
            new User
            {
                UserId = 1,
                FirstName = "Jon",
                LastName = "Doe",
                Children = new List<User> {new User {
                  UserId = 3, FirstName = "Marry", LastName = "Doe"}}
            },
            new User
            {
                UserId = 2,
                FirstName = "Eric",
                LastName = "Newton",
                Children = new List<User> {new User {
                  UserId = 3, FirstName = "Nick", LastName = "Newton"}}
            }
        };

        ParentRepeater.DataSource = users;
        ParentRepeater.DataBind();
    }
}

protected void ParentRepeater_ItemDataBound(object sender, 
    RepeaterItemEventArgs args)
{
    if (args.Item.ItemType == ListItemType.Item || 
       args.Item.ItemType == ListItemType.AlternatingItem)
    {
        var user = args.Item.DataItem as User;
        var childRepeater = (Repeater) args.Item.FindControl("ChildRepeater");

        // You can get parent id like this - 
        // int parentUserId = user.UserId;

        childRepeater.DataSource = user.Children;
        childRepeater.DataBind();
    }
}
Win
  • 61,100
  • 13
  • 102
  • 181