The grid responds to keyboard interactions from the user as well as emitting events when key presses happen on the grid cells. Below shows all the keyboards interactions that can be done with the grid.
Use the arrow keys (← ↑ → ↓) to move focus up, down, left and right. If the focused cell is already on the boundary for that position (e.g. if on the first column and the left key is pressed) then the key press has no effect. Use Ctrl+← to move to the start of the line, and Ctrl+→ to move to the end.
If a cell on the first grid row is focused and you press ↑, the focus will be moved into the grid header. The header navigation focus navigation works the same as the grid's: arrows will move up/down/left/right, Tab will move the focus horizontally until the last header cell and then move on to the next row.
Use Page Up and Page Down to move the scroll up and down by one page. Use Home and End to go to the first and last rows.
When a header cell is focused, commands like Page Up, Page Down, Home, End, Ctrl+←/→ will not work as they do when a grid cell is focused.
If on a group element, hitting the Enter key will expand or collapse the group.
Pressing the Enter key on a cell will put the cell into edit mode, if editing is allowed on the cell. This will work for the default cell editor.
Pressing the Space key on a cell will select the cells row, or deselect the row if already selected. If multi-select is enabled, then the selection will not remove any previous selections.
If you want keyboard navigation turned off, then set suppressCellFocus=true
in the gridOptions.
The grid header supports full keyboard navigation, however the behaviour may differ based on the type of header that is currently focused.
While navigating grouped headers, if the current grouped header is expandable, pressing Enter will toggle the expanded state of the group.
Regular headers may have selection checkboxes, sorting functions and menus, so to access all these functions while focusing a header, you can do the following:
While navigation the floating filters header with the keyboard pressing left/right the focus will move from header cell to header cell, if you wish to navigate within the cell, press Enter to focus the first enabled element within the current floating filter cell, and press Esc to return the focus to the floating filter cell.
The example below has grouped headers, headers and floating filters to demonstrate the features mentioned above:
Most people will be happy with the default navigation the grid does when you use the arrow keys and the Tab key. Some people will want to override this (e.g. you may want the Tab key to navigate to the cell below, not the cell to the right). To facilitate this, the grid offers four methods: navigateToNextCell
, tabToNextCell
, navigateToNextHeader
and tabToNextHeader
.
Provide a callback navigateToNextCell
if you want to override the arrow key navigation.
Provide a callback tabToNextCell
if you want to override the Tab key navigation.
Both functions above use CellPosition
. This is an object that represents a cell in the grid.
Properties available on the CellPosition
interface.
columnTypeColumn | The grid column |
row | A positive number from 0 to n, where n is the last row the grid is rendering or -1 if you want to navigate to the grid header |
row | Either 'top', 'bottom' or null/undefined (for not pinned) |
The functions take a CellPosition
for current and next cells, as well as returning a CellPosition
object. The returned CellPosition
will be the one the grid puts focus on next. Return the provided nextCellPosition
to stick with the grid default behaviour. Return null
/undefined
to skip the navigation.
Provide a callback navigateToNextHeader
if you want to override the arrow key navigation.
Provide a callback tabToNextHeader
if you want to override the Tab key navigation.
Both navigateToNextHeader
and tabToNextHeader
use HeaderPosition
. This is an object that represents a header in the grid.
You should return the HeaderPosition
you want in the navigateToNextHeader
and tabToNextHeader
functions to have it focused. Returning null
or undefined
in navigateToNextHeader
will do nothing (same as focusing the current focused cell), however, doing the same thing in tabToNextHeader
will allow the browser default behaviour for Tab to happen. This is useful for tabbing outside of the grid from the last cell or Shift tabbing out of the grid from the first cell.
The navigateToNextCell
and tabToNextCell
are only called while navigating across grid cells, while
navigateToNextHeader
and tabToNextHeader
are only called while navigating across grid headers.
If you need to navigate from one container to another, pass rowIndex: -1
in CellPosition
or headerRowIndex: -1
in HeaderPosition
.
The example below shows how to use navigateToNextCell
, tabToNextCell
, navigateToNextHeader
and tabToNextHeader
in practice.
Note the following:
navigateToNextCell
swaps the up and down arrow keys.tabToNextCell
uses tabbing to go up and down rather than right and left.navigateToNextHeader
swaps the up and down arrow keys.tabToNextHeader
uses tabbing to go up and down rather than right and left.rowIndex: -1
.headerRowIndex: -1
.Master Detail Grids grids can contain Custom Details that have their own renderer and hence will need to implement its own keyboard navigation. An example of this can be seen in the Custom Details Keyboard Navigation Example.
In applications where the grid is embedded into a larger page, by default, when tabbing into the grid, the first column header will be focused.
You could override this behaviour to focus the first grid cell, if that is a preferred scenario using a combination of DOM event listeners and Grid API calls shown in the following code snippet:
// obtain reference to input element
const myInput = document.getElementById("my-input");
// intercept key strokes within input element
myInput.addEventListener("keydown", event => {
// ignore non tab key strokes
if(event.key !== 'Tab') return;
// prevents tabbing into the url section
event.preventDefault();
// scrolls to the first row
gridApi.ensureIndexVisible(0);
// scrolls to the first column
const firstCol = columnApi.getAllDisplayedColumns()[0];
gridApi.ensureColumnVisible(firstCol);
// sets focus into the first grid cell
gridApi.setFocusedCell(0, firstCol);
}, true);
In the following example there is an input box provided to test tabbing into the grid. Notice the following:
It is possible to add custom behaviour to any key event that you want using the grid events cellKeyDown
(gets called when a DOM keyDown
event fires on a cell).
These keyboard events are monitored by the grid panel, so they will not be fired
when the keydown
happens inside of a popup editor, as popup elements are
rendered in a different DOM tree.
The grid events wrap the DOM events and provides additional information such as row and column details.
The example below shows processing grid cell keyboard events. The following can be noted:
cellKeyDown
is fired, the details of the event are logged to the console.It is possible to stop the grid acting on particular events. To do this implement colDef.suppressHeaderKeyboardEvent
and/or colDef.suppressKeyboardEvent
callback. The callback should return true
if the grid should suppress the events, or false
to continue as normal.
The callback is available as a column callback (set on the column definition). If you want it to apply to all columns then apply to the defaultColDef
property.
The example below demonstrates suppressing the following keyboard events: