title | description | type | page_title | slug | tags | res_type |
---|---|---|---|---|---|---|
Displaying a Nested Grid in a Grid Column Template |
An example on how to display a nested Grid in the Telerik UI for {{ site.framework }} Grid column. |
how-to |
Displaying a Nested Grid in a Grid Column Template |
grid-column-display-nested-grid |
grid, column, template, nested, grid, button, toggle |
kb |
Product | {{ site.product }} Grid |
Progress {{ site.product }} version | Created with the 2024.2.514 version |
How can I display a button in a specified Grid column that toggles a nested Grid?
Here are the steps for implementation:
-
Integrate a Button and a hidden Grid in the main Grid's column by using the [Template component]({% slug htmlhelpers_overview_template %}):
@(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. )
{% if site.core %}
@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>
{% endif %}
-
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));
}
-
[{{ site.framework }} Grid Documentation]({%slug htmlhelpers_grid_aspnetcore_overview%})
-
[{{ site.framework }} Grid Demos](https://demos.telerik.com/{{ site.platform }}/grid/index)
{% if site.core %}
-
[Telerik UI for {{ site.framework }} Video Onboarding Course (Free for trial users and license holders)]({%slug virtualclass_uiforcore%})
{% else %}
-
[Telerik UI for {{ site.framework }} Video Onboarding Course (Free for trial users and license holders)]({%slug virtualclass_uiformvc%})
-
Telerik UI for {{ site.framework }} Forums {% endif %}
- Client-Side API Reference of the Grid for {{ site.framework }}
- [Server-Side API Reference of the Grid for {{ site.framework }}](https://docs.telerik.com/{{ site.platform }}/api/grid) {% if site.core %}
- [Server-Side TagHelper API Reference of the Grid for {{ site.framework }}](https://docs.telerik.com/{{ site.platform }}/api/taghelpers/grid) {% endif %}
- [Telerik UI for {{ site.framework }} Breaking Changes]({%slug breakingchanges_2023%})
- [Telerik UI for {{ site.framework }} Knowledge Base](https://docs.telerik.com/{{ site.platform }}/knowledge-base)