The Hidden Cost of Building Data Grids
Data grids are one of the most common interface patterns on the web, yet they remain one of the most challenging components to build well. A production-ready grid must handle huge datasets without freezing the browser, remain legible across every viewport size, support keyboard navigation for assistive technologies, and give users direct control over the data they're viewing. Getting all of that right from scratch is a project in itself — and many off-the-shelf grid libraries fall short in surprising ways.
Several popular grid libraries ship with only the bare essentials: pagination, filtering, sorting, and basic theming. Some are wrappers around other dependencies, which adds overhead and prevents them from taking full advantage of the framework they're supposed to serve. The result is often a grid that feels sluggish, breaks on smaller screens, ignores accessibility requirements, and forces users into clunky form-based editing workflows. When you need to visualize data from the grid in a chart, embed a custom component, or export to a file, you're typically left to bolt on yet another library — and even then, integrating it seamlessly into the grid itself is usually not possible.
The components that do address these gaps tend to be built natively for a specific framework. Kendo UI, for example, ships four separate grid libraries — for Angular, React, Vue, and jQuery — as part of its broader component suite. Each grid is compiled directly for its target platform rather than adapted from a shared codebase, which makes a tangible difference in runtime behavior and feature parity. The examples below illustrate what's achievable when the grid does the heavy lifting.
Responsive Layouts Without Custom Media Queries
Responsive design is a particular pain point for grids with many columns. Hiding data on small screens requires a strategy: which columns to drop, how to handle horizontal scrolling, and what to do when even the essential columns won't fit side by side. Grid libraries rarely address this, leaving you to write your own media queries and column-show/hide logic for every variation of your data.
Modern grids can handle viewport containers responsively out of the box. To make a Kendo UI Angular grid scrollable when its contents overflow, you only need to give the grid's height CSS property a value and ensure the parent container also has a defined height — no other configuration is necessary. This pattern handles rows that exceed the available vertical space cleanly.
Columns themselves can be made responsive using breakpoint-specific rules. The grid supports a media property on individual column definitions that determines which columns render at which viewport sizes. For example, a stock table on a wide display (media="(min-width: 450px)") can show all columns in full:
On screens between 450 and 680 pixels wide, you might decide to hide the price, in-stock, and discontinued columns for a cleaner layout:
For the smallest viewports, a different approach is possible: collapse all data into a single custom column. The grid keeps everything accessible while adapting the presentation to the available space. Rather than relying solely on numeric pixel breakpoints, the Angular grid also accepts Bootstrap 4 device identifiers such as xs, sm, md, lg, and xl. These are easier to remember but less flexible — they limit you to a single identifier per column, so you can't express something like media="(min-width: 500px) and (max-width: 1200px)".
Accessibility as a Baseline
Screen-reader users and keyboard-only navigators are often an afterthought in grid implementations. Achieving WCAG compliance is time-consuming, especially with complex data tables that need semantic row and column relationships exposed to assistive technology. Some libraries require a significant amount of augmentation work just to pass a basic audit.
Accessibility is easier to guarantee when it's built into the component from the start. Kendo UI grids support WAI-ARIA, Section 508, and WCAG 2.1 standards. The KendoReact grid, for instance, follows Section 508 compliance by making nearly all components keyboard-operable, and advertises the highest WCAG conformance level of AAA. The grid and its embedded components meet the WCAG "Keyboard Accessible" guideline, so a user can navigate through rows, column headers, and interactive cells entirely with the keyboard.
Virtual Scrolling for Rows and Columns
Scrolling through a large dataset can cause a grid to render hundreds or thousands of DOM nodes at once. That's both a memory drain and a performance bottleneck. Virtual scrolling solves this by rendering only a small segment of rows — typically the number of records you specify via the pageSize property — and replacing it with the next segment as the user scrolls. To the user, the experience looks and feels like the entire dataset is in the DOM.
Grid libraries that don't support virtual scrolling often fall back to pagination as their only large-data mechanism. For datasets with thousands of rows, paging through data in small chunks is less efficient and less intuitive for users than continuous scrolling. Even when a library offers virtual scrolling, it usually applies only to the rows of data — not the columns themselves. That becomes a significant limitation with wide data records composed of many properties.
In the Kendo UI for jQuery grid, row virtualization is straightforward: set the grid's scrollable.virtual property to true, and the grid fetches and renders only the items specified in the pageSize property. The same setting works for remote data sources. Below, you can see the behavior when loading data from a local source:
<!DOCTYPE html>
<html>
<head>...</head>
<body>
...
<div id="grid"></div>
<script>
var dataSource = new kendo.data.DataSource({
pageSize: 20,
...
});
$("#grid").kendoGrid({
dataSource: dataSource,
scrollable: {
virtual: true
},
...
});
</script>
</body>
</html>
Column virtualization is also available, utilizing the same scrollable.virtual property but operating independently of pageSize. When records contain many properties that would be expensive to render all at once, virtualizing columns lets the grid render only the columns the user is currently viewing, based on the grid's horizontal scroll position. This prevents the full width of the row from being rendered, which further reduces memory overhead for very wide datasets.
Moving Grid Data Beyond the Browser
Users often need to take grid data outside the application for further analysis, reporting, or sharing. Exporting to PDF and Excel is a standard expectation, yet many grid libraries omit this capability, forcing users into awkward workarounds like printing entire pages or repeatedly copying and pasting content.
Kendo UI Data Grids address this with built-in export support for both formats. In the Kendo UI for Vue Data Grid, PDF generation uses the GridPDFExport component. Calling its save method exports the data you pass to it, whether that is the current page or the entire dataset. The component accepts properties for page size, margins, and scaling, which is handy for fitting larger grids neatly onto PDF pages.
<template>
<button @click="exportPDF">Export PDF</button>
<pdfexport ref="gridPdfExport">
<Grid :data-items="items"></Grid>
</pdfexport>
</template>
<script>
import { GridPdfExport } from '@progress/kendo-vue-pdf';
import { Grid } from '@progress/kendo-vue-grid';
export default {
components: {
'Grid': Grid,
'pdfexport': GridPdfExport
},
data: function () {
return {
products: [],
...
};
},
methods: {
exportPDF: function() {
(this.$refs.gridPdfExport).save(this.products);
},
...
},
...
};
</script>
For finer control, you can supply a page-template to the component. Templates let you apply CSS styling, define custom headers and footers, adjust the page layout, and insert extra elements into the export.
Excel exports follow a similar path with the ExcelExport component. Its saveExcel method accepts the file name, the grid data, and the columns to include, then generates the file.
Keeping Key Columns in View
Horizontal scrolling can hide essential identifiers like names or IDs. Sticky — or locked — columns remain visible at the grid's edge while the rest of the data scrolls. Implementing this yourself is usually painful, requiring invasive styling work that does not scale well across many grids.
In Kendo UI, locking a column is a matter of setting its locked property to true. In Vue grids, for example, the ID column and the Discontinued column stay pinned in place, while the rest of the table scrolls normally underneath.
<pdfexport ref="exportPDF" :margin="'2cm'" :paper-size="'a4'" :scale="0.5">
<Grid :data-items="products"></Grid>
</pdfexport>
You may choose to further customize the export using a template. Within the template, you can add styling, specify headers and footers, change the layout of the page, and add new elements to it. You would use CSS for styling. Once you're done configuring the template, you would specify it using the page-template property of the GridPDFExport component.
<template>
<grid :data-items="people" :columns = "columns">
</grid>
</template>
<script>
import { Grid } from '@progress/kendo-vue-grid';
import { people } from './people'
export default {
components: {
'grid': Grid
},
data: function () {
return {
people: this.getPeople(),
columns: [
{ field: 'ID', title: 'ID', locked: true},
{ field: 'FirstName', title: 'FirstName' },
{ field: 'LastName', title: 'LastName' },
{ field: 'Age', title: 'Age', locked: true},
]
};
},
methods: {
getPeople() {
return people;
}
}
};
</script>
Editing in Place
Some grids are strictly read-only, but viewing alone rarely satisfies real workflows. Editing large datasets one record per form page is tedious and slow. Batch editing — updating, adding, or deleting many rows at once — is where data grids earn their keep.
Kendo UI supports two editing modes: inline, where a cell becomes editable when clicked, and pop-up, which opens a separate form for the entry. In the Kendo UI for jQuery grid, enabling editing is a three-step process: set the grid's editable configuration, set up a data source, and wire CRUD operations to it. Pop-up editing follows the same steps with different options at the start.
Validation is also part of the package. You can mark fields as required, impose minimum lengths, or set value ranges. The input controls are not limited to text — drop-downs, checkboxes, date pickers, and range sliders all work inline or in pop-ups. A common pattern in demos shows a Category field as a drop-down, while a numeric unit price field has validation enforcing a minimum value of 1.
Grids Should Ship with More
Grid libraries that only provide a grid put developers in a bind. If a surrounding component is missing, you either patch it with an incompatible library or build it yourself and risk breaking the grid's behavior.
Kendo UI takes a broader approach: the grid sits inside a larger component library covering data management, navigation, charting, editing, media, and more. Because they are designed to work together, embeddings do not require elaborate integration. A notable example shows that angular data table with fully interactive charts embedded inside each row of a 1 Day column — no wiring hacks required, the components simply work.
The Takeaway
A production-grade data grid must be more than a fast repeater of rows. It needs responsive behavior, sticky columns, accessibility, and speed aided by native builds and virtual scrolling. On top of that, it should let make users act on their data — editing it in bulk, exporting it to common formats — and permit extra components to nestle seamlessly inside columns. A library that addresses these concerns without friction saves weeks of custom UI work and yields a better experience for the people using the app.



