Search code examples
asp.netlistviewasp.net-controls

ASP.Net ListView Grouping by Data Field?


I uses asp.net listview control to display the details. Each item has the group details. For demo purposes group is hard coded.

I want to display the listview as shown below

enter image description here

Right now, I have this

enter image description here

Code:

    <asp:ListView ID="HyperLinkListView" runat="server" ViewStateMode="Disabled" ItemPlaceholderID="itemContainer" GroupPlaceholderID="groupContainer">
    <LayoutTemplate>
        <section class="quick-links">
            <div class="row">
                <div class="dfwp-column" style="width: 100%">
                    <div class="slm-layout-main groupmarker">
                        <ul class="dfwp-list">
                            <asp:PlaceHolder ID="groupContainer" runat="server" />
                        </ul>
                    </div>
                </div>
            </div>
        </section>
    </LayoutTemplate>
    <GroupTemplate>
        <span>Group</span>
        <asp:PlaceHolder ID="itemContainer" runat="server" />
    </GroupTemplate>
    <ItemTemplate>
        <li>
            <div class="item">
                <div class="link-item">
                    <asp:HyperLink Target="_blank" ID="hyperlink" NavigateUrl='<%# this.LinkToPlay((((SPListItem)Container.DataItem)["VideoFileName"]).ToString()) %>' Text='<%# Eval("Title") %>' runat="server" />
                    </a>
                </div>
            </div>
        </li>
    </ItemTemplate>
    <EmptyDataTemplate>
        <span>No data was returned.</span>
    </EmptyDataTemplate>
</asp:ListView>

How do I achieve this?


Solution

  • For a flexible solution, you can use nested ListView
    enter image description here
    You will need to update your HTML and CSS to get the desired appearance.

    ASPX Code

    <asp:ListView ID="GroupsListView" runat="server" ViewStateMode="Disabled" ItemPlaceholderID="groupContainer" OnItemDataBound="GroupsListView_ItemDataBound">
        <LayoutTemplate>
            <section class="quick-links">
                <div class="row">
                    <div class="dfwp-column" style="width: 100%">
                        <div class="slm-layout-main groupmarker">
                            <asp:PlaceHolder ID="groupContainer" runat="server" />
                        </div>
                    </div>
                </div>
            </section>
        </LayoutTemplate>
        <ItemTemplate>
            <ul class="dfwp-list">
                <li><%# Eval("Title") %></li>
                <div>
                    <asp:ListView runat="server" ID="ItemsListView" ItemPlaceholderID="itemContainer">
                        <LayoutTemplate>
                            <section class="quick-links">
                                <div class="row">
                                    <div class="dfwp-column" style="width: 100%">
                                        <div class="slm-layout-main groupmarker">
                                            <ul class="dfwp-list">
                                                <asp:PlaceHolder ID="itemContainer" runat="server" />
                                            </ul>
                                        </div>
                                    </div>
                                </div>
                            </section>
                        </LayoutTemplate>
                        <ItemTemplate>
                            <li>
                                <div class="item">
                                    <div class="link-item">
                                        <asp:HyperLink Target="_blank" ID="hyperlink" NavigateUrl='<%# Eval("Url") %>' Text='<%# Eval("Title") %>' runat="server" />
                                        </a>
                                    </div>
                                </div>
                            </li>
                        </ItemTemplate>
                    </asp:ListView>
                </div>
            </ul>
        </ItemTemplate>
        <EmptyDataTemplate>
            <span>No data was returned.</span>
        </EmptyDataTemplate>
    </asp:ListView>
    

    In the code behind you need to bind the child ListView in parent ItemDataBound event.

    protected void GroupsListView_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        ListView itemsListView = (ListView)e.Item.FindControl("ItemsListView");
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
    
            itemsListView.DataSource = ((Group)e.Item.DataItem).Items;
            itemsListView.DataBind();
        }
    }