Search code examples
c#asp.netdatarepeaternested-repeater

Display generic list data back to repeater in a grouped manner


I have a generic list

List<StudentInfo>

StudentInfo has

Name,Marks,Subject,Age as properties.

I get this StudentInfo back as as list, which am trying to bind to a repeater.

<asp:Repeater ID="myRepeater" runat="server">
            <ItemTemplate>                
                     <%# Eval("Name") %>                
                     <%# Eval("Marks") %>
                     <%# Eval("Subject") %>
                     <%# Eval("Age") %>                  
            </ItemTemplate>
        </asp:Repeater>

Output i am getting:

John Smith
85
English
12
John Doe
78
English
12
Mary Ann
72
Chemistry
14

Expected result on repeater databinding is - data should be display per subject

English

John Smith
85
12
John Doe
78
12


Chemistry

Mary Ann
72
14

I tried to use nested repeater, but not getting the expected result. The below one just gives me only subject back when the code behind is

              myParent.DataSource = listOfStudentInfo;

              myParent.DataBind();

How do i make the child repeater to show the rest?

 <asp:Repeater ID="myParent" runat="server">
            <ItemTemplate>               
                        <%# Eval("Subject") %>                  
                <asp:Repeater runat="server" ID="myChild">
                 <ItemTemplate>               
                         <%# Eval("Name") %>   
                         <%# Eval("Marks") %>   
                         <%# Eval("Age") %>   
                  </ItemTemplate>
                 </asp:Repeater> 
               </ItemTemplate>
</asp:Repeater>

Solution

  • change your datasource Model to have enumerable of StudentInfo object like this,

    public class Model{
      public string Subject {get; set;}
      public IEnumerable<StudentInfo> StudentInfo {get; set;}
    }
    

    Then your parent repeater have subject property and nested repeater have StudentInfo as DataSource,

    <asp:Repeater ID="myParent" runat="server">
                <ItemTemplate>               
                            <%# Eval("Subject") %>                  
                    <asp:Repeater runat="server" ID="myChild" DataSource='<%# Eval("StudentInfo ") %>'>
                     <ItemTemplate>               
                             <%# Eval("Name") %>   
                             <%# Eval("Marks") %>   
                             <%# Eval("Age") %>   
                      </ItemTemplate>
                     </asp:Repeater> 
                   </ItemTemplate>
    </asp:Repeater>
    

    And your dataSource for Parents goes like this,

                  myParent.DataSource = listOfModel;    
                  myParent.DataBind();