Displaying a Nested Grid in a Grid Column Template
Environment
Product | Telerik UI for ASP.NET Core Grid |
Progress Telerik UI for ASP.NET Core version | Created with the 2024.2.514 version |
Description
How can I display a button in a specified Grid column that toggles a nested Grid?
Solution
Here are the steps for implementation:
-
Integrate a Button and a hidden Grid in the main Grid's column by using the Template component:
@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.OrderViewModel>() .Name("grid") .Columns(columns => { columns.Bound(f => f.Id) .ClientTemplate(Html.Kendo().Template() .AddComponent(x => x .Button() .Name("detailsBtn_${data.Id}") .Content("Expand") .Events(ev => ev.Click("onDetailsClick")) ) .AddHtml("<div class='gridContainer'>") .AddComponent(x => x .Grid<DetailsViewModel>() .Name("detailsGrid_${data.Id}") .AutoBind(false) // Prevent the initial Read request during the Grid's initialization. .Columns(c => { c.Bound(x => x.Id); c.Bound(x => x.Name); }) .Scrollable() .HtmlAttributes(new { style = "height: 200px;"}) .DataSource(dataSource => dataSource .Ajax() .PageSize(20) .Read(read => read.Action("DetailsRead", "Grid")) ) ) .AddHtml("</div>") ); }) // Other configuration. )
@addTagHelper *, Kendo.Mvc <kendo-grid name="grid"> <columns> <column field="Id"> <column-template> <kendo-button name="detailsBtn_${data.Id}" on-click="onDetailsClick"> Expand </kendo-button> <div class='gridContainer'> <kendo-grid name="detailsGrid_${data.Id}" auto-bind="false" height="200"> <columns> <column field="Id"></column> <column field="Name"></column> </columns> <scrollable enabled="true" /> <datasource type="DataSourceTagHelperType.Ajax" page-size="20"> <schema data="Data" total="Total" errors="Errors"> <model id="Id"></model> </schema> <transport> <read url="@Url.Action("DetailsRead","Grid")"/> </transport> </datasource> </kendo-grid> </div> </column-template> </column> </columns> <!-- Other configuration --> </kendo-grid>
-
Hide the
div
element that wraps the Grid declaration:<style> .gridContainer { display: none; } </style>
-
Handle the
click
event of the Expand button and toggle the Grid's container. Get a reference to the Grid and call theread()
method of its DataSource by passing the Id field to the server to filter the data based on the data item of the current row (the main Grid's row).function onDetailsClick(e) { var id = $(e.target).attr("id").split("_")[1]; var btnLabel = $(e.target).find(".k-button-text").html(); // Get the current label of the Button. if (btnLabel == "Expand") { $(e.target).find(".k-button-text").html("Collapse"); } else $(e.target).find(".k-button-text").html("Expand"); $(e.target).next().toggle(); // Toggle the visibility of the nested Grid. var grid = $(`#detailsGrid_${id}`).data("kendoGrid").dataSource.read({ parentId: id }); }
public ActionResult DetailsRead([DataSourceRequest] DataSourceRequest request, int parentId) { var filteredData = gridData.Where(x => x.Id == parentId); // Filter the nested Grid based on the "Id" of the parent record. return Json(filteredData.ToDataSourceResult(request)); }