DevExtreme v24.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

Keyboard Navigation

In this demo, you can use the following keys and key combinations to interact with the DataGrid:

  • Enter
    Execute an action on a focused element.

  • Tab
    Navigate within DataGrid elements.

  • Ctrl + or Ctrl +
    Navigate between a column header, filter row, data area, filter panel, and pager.

Backend API
<p>Click this text and press <b>Tab</b></p> <dx-data-grid id="gridContainer" [dataSource]="employees" keyExpr="ID" [showBorders]="true" [focusedRowEnabled]="true" > <dxo-editing [allowUpdating]="true" [allowDeleting]="true" [selectTextOnEditStart]="true" [useIcons]="true" > </dxo-editing> <dxo-header-filter [visible]="true"> </dxo-header-filter> <dxo-filter-panel [visible]="true"> </dxo-filter-panel> <dxo-filter-row [visible]="true"> </dxo-filter-row> <dxo-paging [pageSize]="10"> </dxo-paging> <dxo-pager [allowedPageSizes]="[5, 10]" [showPageSizeSelector]="true" [showNavigationButtons]="true" > </dxo-pager> <dxi-column dataField="FirstName"> </dxi-column> <dxi-column dataField="LastName"> </dxi-column> <dxi-column dataField="Position"> </dxi-column> <dxi-column dataField="StateID" caption="State"> <dxo-lookup [dataSource]="states" valueExpr="ID" displayExpr="Name"> </dxo-lookup> </dxi-column> </dx-data-grid>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxDataGridModule } from 'devextreme-angular'; import { Service, Employee, State } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ styleUrls: ['app/app.component.css'], selector: 'demo-app', templateUrl: 'app/app.component.html', providers: [Service], }) export class AppComponent { employees: Employee[]; states: State[]; constructor(service: Service) { this.employees = service.getEmployees(); this.states = service.getStates(); } } @NgModule({ imports: [ BrowserModule, DxDataGridModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
import { Injectable } from '@angular/core'; export class Employee { ID: number; FirstName: string; LastName: string; Prefix: string; Position: string; BirthDate: string; Address: string; StateID: number; } export class State { ID: number; Name: string; } const employees: Employee[] = [ { ID: 1, FirstName: 'John', LastName: 'Heart', Prefix: 'Mr.', Position: 'CEO', BirthDate: '1964/03/16', Address: '351 S Hill St.', StateID: 5, }, { ID: 2, FirstName: 'Olivia', LastName: 'Peyton', Prefix: 'Mrs.', Position: 'Sales Assistant', BirthDate: '1981/06/03', Address: '807 W Paseo Del Mar', StateID: 5, }, { ID: 3, FirstName: 'Robert', LastName: 'Reagan', Prefix: 'Mr.', Position: 'CMO', BirthDate: '1974/09/07', Address: '4 Westmoreland Pl.', StateID: 4, }, { ID: 4, FirstName: 'Greta', LastName: 'Sims', Prefix: 'Ms.', Position: 'HR Manager', BirthDate: '1977/11/22', Address: '1700 S Grandview Dr.', StateID: 11, }, { ID: 5, FirstName: 'Brett', LastName: 'Wade', Prefix: 'Mr.', Position: 'IT Manager', BirthDate: '1968/12/01', Address: '1120 Old Mill Rd.', StateID: 13, }, { ID: 6, FirstName: 'Sandra', LastName: 'Johnson', Prefix: 'Mrs.', Position: 'Controller', BirthDate: '1974/11/15', Address: '4600 N Virginia Rd.', StateID: 44, }, { ID: 7, FirstName: 'Kevin', LastName: 'Carter', Prefix: 'Mr.', Position: 'Shipping Manager', BirthDate: '1978/01/09', Address: '424 N Main St.', StateID: 5, }, { ID: 8, FirstName: 'Cynthia', LastName: 'Stanwick', Prefix: 'Ms.', Position: 'HR Assistant', BirthDate: '1985/06/05', Address: '2211 Bonita Dr.', StateID: 4, }, { ID: 9, FirstName: 'Kent', LastName: 'Samuelson', Prefix: 'Dr.', Position: 'Ombudsman', BirthDate: '1972/09/11', Address: '12100 Mora Dr', StateID: 26, }, { ID: 10, FirstName: 'Taylor', LastName: 'Riley', Prefix: 'Mr.', Position: 'Network Admin', BirthDate: '1982/08/14', Address: '7776 Torreyson Dr', StateID: 5, }, { ID: 11, FirstName: 'Sam', LastName: 'Hill', Prefix: 'Mr.', Position: 'Sales Assistant', BirthDate: '1984/02/17', Address: '645 Prospect Crescent', StateID: 11, }, { ID: 12, FirstName: 'Kelly', LastName: 'Rodriguez', Prefix: 'Ms.', Position: 'Support Assistant', BirthDate: '1988/05/11', Address: '1601 W Mountain St.', StateID: 5, }, { ID: 13, FirstName: 'Natalie', LastName: 'Maguirre', Prefix: 'Mrs.', Position: 'Trainer', BirthDate: '1977/10/07', Address: '6400 E Bixby Hill Rd', StateID: 29, }, { ID: 14, FirstName: 'Walter', LastName: 'Hobbs', Prefix: 'Mr.', Position: 'Programmer', BirthDate: '1984/12/24', Address: '10385 Shadow Oak Dr', StateID: 13, }, ]; const states: State[] = [ { ID: 1, Name: 'Alabama', }, { ID: 2, Name: 'Alaska', }, { ID: 3, Name: 'Arizona', }, { ID: 4, Name: 'Arkansas', }, { ID: 5, Name: 'California', }, { ID: 6, Name: 'Colorado', }, { ID: 7, Name: 'Connecticut', }, { ID: 8, Name: 'Delaware', }, { ID: 9, Name: 'District of Columbia', }, { ID: 10, Name: 'Florida', }, { ID: 11, Name: 'Georgia', }, { ID: 12, Name: 'Hawaii', }, { ID: 13, Name: 'Idaho', }, { ID: 14, Name: 'Illinois', }, { ID: 15, Name: 'Indiana', }, { ID: 16, Name: 'Iowa', }, { ID: 17, Name: 'Kansas', }, { ID: 18, Name: 'Kentucky', }, { ID: 19, Name: 'Louisiana', }, { ID: 20, Name: 'Maine', }, { ID: 21, Name: 'Maryland', }, { ID: 22, Name: 'Massachusetts', }, { ID: 23, Name: 'Michigan', }, { ID: 24, Name: 'Minnesota', }, { ID: 25, Name: 'Mississippi', }, { ID: 26, Name: 'Missouri', }, { ID: 27, Name: 'Montana', }, { ID: 28, Name: 'Nebraska', }, { ID: 29, Name: 'Nevada', }, { ID: 30, Name: 'New Hampshire', }, { ID: 31, Name: 'New Jersey', }, { ID: 32, Name: 'New Mexico', }, { ID: 33, Name: 'New York', }, { ID: 34, Name: 'North Carolina', }, { ID: 35, Name: 'Ohio', }, { ID: 36, Name: 'Oklahoma', }, { ID: 37, Name: 'Oregon', }, { ID: 38, Name: 'Pennsylvania', }, { ID: 39, Name: 'Rhode Island', }, { ID: 40, Name: 'South Carolina', }, { ID: 41, Name: 'South Dakota', }, { ID: 42, Name: 'Tennessee', }, { ID: 43, Name: 'Texas', }, { ID: 44, Name: 'Utah', }, { ID: 45, Name: 'Vermont', }, { ID: 46, Name: 'Virginia', }, { ID: 47, Name: 'Washington', }, { ID: 48, Name: 'West Virginia', }, { ID: 49, Name: 'Wisconsin', }, { ID: 50, Name: 'Wyoming', }, { ID: 51, Name: 'North Dakota', }]; @Injectable() export class Service { getEmployees() { return employees; } getStates() { return states; } }
// In real applications, you should not transpile code in the browser. // You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ const componentNames = [ 'accordion', 'action-sheet', 'autocomplete', 'bar-gauge', 'box', 'bullet', 'button-group', 'button', 'calendar', 'chart', 'check-box', 'circular-gauge', 'color-box', 'context-menu', 'data-grid', 'date-box', 'date-range-box', 'defer-rendering', 'diagram', 'draggable', 'drawer', 'drop-down-box', 'drop-down-button', 'file-manager', 'file-uploader', 'filter-builder', 'form', 'funnel', 'gallery', 'gantt', 'html-editor', 'linear-gauge', 'list', 'load-indicator', 'load-panel', 'lookup', 'map', 'menu', 'multi-view', 'nested', 'number-box', 'pie-chart', 'pivot-grid-field-chooser', 'pivot-grid', 'polar-chart', 'popover', 'popup', 'progress-bar', 'radio-group', 'range-selector', 'range-slider', 'recurrence-editor', 'resizable', 'responsive-box', 'sankey', 'scheduler', 'scroll-view', 'select-box', 'slider', 'sortable', 'sparkline', 'speed-dial-action', 'splitter', 'switch', 'tab-panel', 'tabs', 'tag-box', 'text-area', 'text-box', 'tile-view', 'toast', 'toolbar', 'tooltip', 'tree-list', 'tree-map', 'tree-view', 'validation-group', 'validation-summary', 'validator', 'vector-map', ]; window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, '@angular/platform-browser-dynamic': { 'esModule': true, }, '@angular/platform-browser': { 'esModule': true, }, '@angular/core': { 'esModule': true, }, '@angular/common': { 'esModule': true, }, '@angular/common/http': { 'esModule': true, }, '@angular/animations': { 'esModule': true, }, '@angular/forms': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', 'bundles:': '../../../../bundles/', }, map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', /* @angular */ '@angular/compiler': 'bundles:@angular/compiler.umd.js', '@angular/platform-browser-dynamic': 'bundles:@angular/platform-browser-dynamic.umd.js', '@angular/core': 'bundles:@angular/core.umd.js', '@angular/core/primitives/signals': 'bundles:@angular/core.primitives.signals.umd.js', '@angular/common': 'bundles:@angular/common.umd.js', '@angular/common/http': 'bundles:@angular/common-http.umd.js', '@angular/platform-browser': 'bundles:@angular/platform-browser.umd.js', '@angular/platform-browser/animations': 'bundles:@angular/platform-browser.umd.js', '@angular/forms': 'bundles:@angular/forms.umd.js', /* devextreme */ 'devextreme': 'npm:devextreme@24.1.3/cjs', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'devextreme/bundles/dx.all': 'npm:devextreme@24.1.3/bundles/dx.all.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.8', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56', /* devextreme-angular umd maps */ 'devextreme-angular': 'bundles:devextreme-angular/devextreme-angular.umd.js', 'devextreme-angular/core': 'bundles:devextreme-angular/devextreme-angular-core.umd.js', ...componentNames.reduce((acc, name) => { acc[`devextreme-angular/ui/${name}`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}.umd.js`; return acc; }, {}), 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'tslib': 'npm:tslib@2.6.1/tslib.js', 'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js', 'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, 'rxjs': { defaultExtension: 'js', }, 'rxjs/operators': { defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', 'npm:rxjs@7.5.3/package.json', 'npm:rxjs@7.5.3/operators/package.json', 'npm:devexpress-diagram@2.2.8/package.json', 'npm:devexpress-gantt@4.1.56/package.json', ], }; System.config(window.config); // System.import('@angular/compiler').catch(console.error.bind(console));
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.3/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.13.0/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.13/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import("app").catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>