New to Telerik UI for ASP.NET MVC? Start a free 30-day trial

Grid Accessibility

Updated on Oct 27, 2026

The Telerik UI for ASP.NET MVC Grid provides extensive accessibility support out of the box and helps users with disabilities use all component features.

The Grid complies with the Web Content Accessibility Guidelines (WCAG) 2.2 AA standards and Section 508 requirements. It follows Web Accessibility Initiative - Accessible Rich Internet Applications (WAI-ARIA) best practices for keyboard navigation, supports focus management, and is tested with popular screen readers.

WAI-ARIA

This section lists the selectors, attributes, and behavior patterns supported by the component and its composite elements.

The Grid is a composite component with four logically separated structural elements:

  • Toolbar (role="toolbar").
  • Group header (role="toolbar").
  • Data Grid (role="grid").
  • Pager (role="application").

Grid Toolbar

The Grid Toolbar follows the specification of the ToolBar component.

ToolBar accessibility specification

SelectorAttributeUsage
.k-grid-toolbarrole=toolbarThe toolbar is a collection of command buttons and inputs.
aria-labelClarifies the purpose of the toolbar.
aria-controls=.k-grid-aria-root idPoints to the id of the element with role=grid.

Grid Grouping Header

The Grid Grouping Header follows the specification of the ToolBar component.

ToolBar accessibility specification

SelectorAttributeUsage
.k-grouping-headerrole=toolbarThe Grouping header is a ToolBar (collection of buttons).
aria-labelClarifies the purpose of the header.
aria-controls=.k-grid-aria-root idPoints to the id of the element with role=grid.
.k-grouping-header .k-chip-list .k-chiprole=buttonIf the element used is not <button>, then the role must be specified.
.k-grouping-header .k-chip-listrole=noneThe ChipList default listbox role is removed to keep the toolbar-to-button role hierarchy.
titlePresent on the element or its child if sorting is enabled for that field.

Data Grid (excluding Toolbars and Pager)

The element with role=grid must not include the ToolBar and Pager elements because they do not belong to the role=grid element itself.

Grid element

SelectorAttributeUsage
.k-grid:not(.k-treelist) .k-grid-aria-rootrole=gridThe role specifies the element is a Data Grid.
.k-grid-aria-rootaria-colcountThe total number of columns in the Grid. Needed only for Virtual columns and Hidden columns scenarios, when not all columns are rendered in the DOM. If the total number of columns is unknown, the value of aria-colcount must be set to -1.
aria-rowcountThe total number of rows in the table (header rows + master rows + detail rows + data rows + footer rows + aggregates rows). Needed only when Paging (and more than one page is present in the component), Virtual rows, or Master/Detail rows (Hierarchical Grid, Detail Template Grid) are enabled. If data is also Grouped, the proper number of all rows could not be calculated. In that case the value must be set to -1.

When master and detail rows are present in the Grid (Hierarchical Grid, Detail Template Grid), calculate aria-rowcount (the total number of rows) as follows: 2 * (total number of items) + header rows + footer rows. This is required because each item has a master row and a detail row, which doubles the row count.

If the Grid is composed of a single table (there is no separate <table> element for its header), no role attributes should be set on its inner elements (<thead>, <body>, <tr>, <th>, and <td>). Their semantic meaning is used instead.

Grid header

SelectorAttributeUsage
.k-grid-header-wrap>tablerole=presentation/noneNegates the default semantic role of the <table> element.
.k-grid-header-wrap>table>theadrole=rowgroupRequired as the owner <table> element has its semantic role removed.
.k-grid-header-wrap>table>thead>trrole=rowRequired as the owner <table> element has its semantic role removed.
aria-rowindexRow number including all headers, data (including master and detail) rows, and footers starting from 1. Needed only when Paging (and more than one page is present in the component), Virtual rows, or Master/Detail rows (Hierarchical Grid, Detail Template Grid) are enabled. If data is also Grouped, the proper indexing could not be calculated. Hence, the attribute must not be set.
.k-grid-header-wrap>table>thead>tr>th:not(.k-hierarchy-cell):not(.k-group-cell):not(.k-drag-cell)role=columnheaderRequired as the owner <table> element has its semantic role removed.
aria-sort=none/ascending/descendingPresent if sorting is enabled for that column.
title or aria-labelPresent on the element or its child if sorting is enabled for that field.
aria-colindexCol number, based on leaf columns, starting from 1. Needed only for Virtual columns and Hidden columns scenarios, when not all columns are rendered in the DOM. Otherwise, can be interpreted from the DOM structure. Can be calculated by summing previous columns colspans.
aria-haspopup=dialogThe attribute must be present if the column has a ColumnMenu.
aria-haspopup=dialogThe attribute must be present if the column has a FilterMenu and no ColumnMenu.

Grid filter row

Even when it is part of the <thead>, the Filter row must use <td> elements.

SelectorAttributeUsage
.k-grid-header-wrap>table>thead>tr.k-filter-row>tdrole=gridcellRequired as the owner <table> element has its semantic role removed.
aria-labelHas a label indicating that the cell is part of a filter row.

Grid filter menu

Implements the FilterMenu specification.

FilterMenu accessibility specification

Grid column menu

Implements the ColumnMenu specification.

ColumnMenu accessibility specification

Grid content

SelectorAttributeUsage
.k-grid-content>tablerole=none/presentationNegates the default semantic role of the <table> element.
.k-grid-content>table>tbodyrole=rowgroupRequired as the owner <table> element has its semantic role removed.
.k-grid-content>table>tbody>trrole=rowRequired as the owner <table> element has its semantic role removed.
aria-rowindexRow number including all headers, data (including master and detail) rows, and footers starting from 1. Needed only when Paging (and more than one page is present in the component), Virtual rows, or Master/Detail rows (Hierarchical Grid, Detail Template Grid) are enabled. If data is also Grouped, the proper indexing could not be calculated. Hence, the attribute must not be set. In scenarios when master and detail rows are present in the Grid (Hierarchical Grid, Detail Template Grid), both master and detail rows must always be indexed. For example, if the first master row has aria-rowindex=2, even if its detail row is not present in the DOM, the next master row must have aria-rowindex=4. When rendered, the detail row must receive the missing index between the two master rows. In this example it would be aria-rowindex=3.
.k-grid-content tr.k-selectedaria-selected=trueSet on the currently selected row(s). Only used when selection mode is set to row.
.k-grid-content>table>tbody>tr>tdrole=gridcellRequired as the owner <table> element has its semantic role removed.
aria-colindexCol number, based on leaf columns, starting from 1. Needed only for Virtual columns and Hidden columns scenarios, when not all columns are rendered in the DOM. Otherwise, can be interpreted from the DOM structure. Can be calculated by summing previous columns colspans.
td.k-selectedaria-selected=trueSet on the currently selected cell(s). Only used when selection mode is set to cell.
.k-master-row .k-hierarchy-cell,.k-grouping-row>tdaria-expanded=true/falseOptionally for cells holding grouping criteria values and for Master row cells in Detail template scenario.
.k-drag-cellaria-labelMust be present in a Drag Row scenario on the cell containing the drag handle.
.k-grid-header-locked .k-grid-header-table .k-table-rowaria-ownsWhen there are locked columns, the rows from the locked header table should own the cells from the corresponding non-locked header table rows. Value should be a space-separated list of ids.
.k-grid-content-locked .k-grid-table .k-table-rowaria-ownsWhen there are locked columns, the rows from the locked content table should own the cells from the corresponding non-locked content table rows. Value should be a space-separated list of ids.
.k-grid-header-wrap .k-grid-header-table .k-table-rowrole=presentation/noneWhen there are locked columns, the rows from the non-locked header table should have their default semantic role removed, as their children are owned by the corresponding row from the locked table.
.k-grid-content .k-grid-table .k-table-rowrole=presentation/noneWhen there are locked columns, the rows from the non-locked content table should have their default semantic role removed, as their children are owned by the corresponding row from the locked table.

Grid popup editor

The popup editor consists of a Window component containing a Form component.

Window accessibility specification

Form accessibility specification

The Aggregates totals are placed within a <tfoot> element in the Content <table>.

SelectorAttributeUsage
tfootrole=rowgroupRequired as the owner <table> element has its semantic role removed.
tfoot>trrole=rowRequired as the owner <table> element has its semantic role removed.
aria-rowindexRow number including all headers, data (including master and detail) rows, and footers starting from 1. Footer rows are always the last ones in a Grid. Needed only when Paging (and more than one page is present in the component), Virtual rows, or Master/Detail rows (Hierarchical Grid, Detail Template Grid) are enabled. If data is also Grouped, the proper indexing could not be calculated. Hence, the attribute must not be set.
tfoot>tr>tdrole=gridcellRequired as the owner <table> element has its semantic role removed.
aria-colindexCol number, based on leaf columns, starting from 1. Needed only for Virtual columns and Hidden columns scenarios, when not all columns are rendered in the DOM. Otherwise, can be interpreted from the DOM structure. Can be calculated by summing previous columns colspans.

Pager

For the Grid Pager WAI-ARIA specification, review the Pager component.

Pager accessibility specification

Grid selection aggregates

The selection aggregates are placed within a .k-grid-selection-aggregates element after the Grid .k-grid-aria-root element.

SelectorAttributeUsage
.k-grid-selection-aggregatesaria-live=politeEnsures that changes in the calculated selection aggregates are announced by assistive technologies.

Data Grid Stacked Layout

The element is a regular Grid cell (td element) that holds a stacked layout content representing all available column headers and content for the given row. All internal "stacked cell" elements become focusable when focus is moved within the cell.

SelectorAttributeUsage
.k-grid-stack-celltabindex=0"Stacked cell" elements receive tabindex '0' when focus is within their parent '.k-grid-stack-row' element. This allows the end user to navigate through the content using Tab. The tabindex attribute is removed when focus leaves the '.k-grid-stack-row' element.

Resources

WAI-ARIA specification for grid

Section 508

The Grid is fully compliant with Section 508 requirements.

Testing

The Grid has been extensively tested with automated checks through axe-core and manual checks with popular screen readers.

To report accessibility issues, contact the team through the Telerik Support System.

Screen Readers

The Grid has been tested with the following screen reader and browser combinations:

EnvironmentTool
FirefoxNVDA
ChromeJAWS
Microsoft EdgeJAWS

Test Example

To test the Grid component, refer to the Grid Accessibility Demo.

Keyboard Navigation

For details on how the Grid keyboard navigation works, refer to the Grid Keyboard Navigation article.

See Also