Your search did not match any results.
Data Grid

Cascading Lookups

Documentation

This demo shows how to populate a lookup column depending on the value of another column. For example, if you select a state, the City column allows selecting cities located only in this state. In code, this is achieved by applying a filter to the lookup data source in the lookup.dataSource function. Also, take note of the columns.setCellValue function that resets the selected city each time you choose another state, and the onEditorPreparing function that disables the City cell if the state is undefined.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import DataGrid, { Column, Editing, Lookup } from 'devextreme-react/data-grid'; import service from './data.js'; class App extends React.Component { constructor(props) { super(props); this.dataSource = service.getEmployees(); this.states = service.getStates(); this.cities = service.getCities(); this.getFilteredCities = this.getFilteredCities.bind(this); } getFilteredCities(options) { return { store: this.cities, filter: options.data ? ['StateID', '=', options.data.StateID] : null }; } onEditorPreparing(e) { if (e.parentType === 'dataRow' && e.dataField === 'CityID') { e.editorOptions.disabled = (typeof e.row.data.StateID !== 'number'); } } setStateValue(rowData, value) { rowData.CityID = null; this.defaultSetCellValue(rowData, value); } render() { return ( <div id={'data-grid-demo'}> <DataGrid dataSource={this.dataSource} keyExpr={'ID'} showBorders={true} onEditorPreparing={this.onEditorPreparing} > <Editing mode={'row'} allowUpdating={true} allowAdding={true}> </Editing> <Column dataField={'FirstName'} /> <Column dataField={'LastName'} /> <Column dataField={'Position'} /> <Column dataField={'StateID'} caption={'State'} setCellValue={this.setStateValue}> <Lookup dataSource={this.states} displayExpr={'Name'} valueExpr={'ID'} /> </Column> <Column dataField={'CityID'} caption={'City'}> <Lookup dataSource={this.getFilteredCities} displayExpr={'Name'} valueExpr={'ID'} /> </Column> </DataGrid> </div> ); } } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app') );
<!DOCTYPE html> <html> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.5/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#data-grid-demo { min-height: 700px; }
const employees = [{ 'ID': 1, 'FirstName': 'John', 'LastName': 'Heart', 'Prefix': 'Mr.', 'Position': 'CTO', 'StateID': 5, 'CityID': 17 }, { 'ID': 2, 'FirstName': 'Olivia', 'LastName': 'Peyton', 'Prefix': 'Mrs.', 'Position': 'HR Manager', 'StateID': 5, 'CityID': 17 }, { 'ID': 3, 'FirstName': 'Robert', 'LastName': 'Reagan', 'Prefix': 'Mr.', 'Position': 'IT Manager', 'StateID': 4, 'CityID': 14 }, { 'ID': 4, 'FirstName': 'Greta', 'LastName': 'Sims', 'Prefix': 'Ms.', 'Position': 'Shipping Manager', 'StateID': 3, 'CityID': 8 }, { 'ID': 5, 'FirstName': 'Brett', 'LastName': 'Wade', 'Prefix': 'Mr.', 'Position': 'Shipping Manager', 'StateID': 3, 'CityID': 9 }, { 'ID': 6, 'FirstName': 'Sandra', 'LastName': 'Johnson', 'Prefix': 'Mrs.', 'Position': 'Network Admin', 'StateID': 2, 'CityID': 6 }, { 'ID': 7, 'FirstName': 'Kevin', 'LastName': 'Carter', 'Prefix': 'Mr.', 'Position': 'Network Admin', 'StateID': 1, 'CityID': 3 }, { 'ID': 8, 'FirstName': 'Cynthia', 'LastName': 'Stanwick', 'Prefix': 'Ms.', 'Position': 'Sales Assistant', 'StateID': 1, 'CityID': 3 }, { 'ID': 9, 'FirstName': 'Kent', 'LastName': 'Samuelson', 'Prefix': 'Dr.', 'Position': 'Sales Assistant', 'StateID': 1, 'CityID': 2 }, { 'ID': 10, 'FirstName': 'Taylor', 'LastName': 'Riley', 'Prefix': 'Mr.', 'Position': 'Support Assistant', 'StateID': 5, 'CityID': 17 }, { 'ID': 11, 'FirstName': 'Sam', 'LastName': 'Hill', 'Prefix': 'Mr.', 'Position': 'Sales Assistant', 'StateID': 2, 'CityID': 5 }, { 'ID': 12, 'FirstName': 'Kelly', 'LastName': 'Rodriguez', 'Prefix': 'Ms.', 'Position': 'Sales Assistant', 'StateID': 5, 'CityID': 17 }, { 'ID': 13, 'FirstName': 'Natalie', 'LastName': 'Maguirre', 'Prefix': 'Mrs.', 'Position': 'Sales Assistant', 'StateID': 4, 'CityID': 14 }, { 'ID': 14, 'FirstName': 'Walter', 'LastName': 'Hobbs', 'Prefix': 'Mr.', 'Position': 'Support Assistant', 'StateID': 2, 'CityID': 5 }]; const states = [{ 'ID': 1, 'Name': 'Alabama' }, { 'ID': 2, 'Name': 'Alaska' }, { 'ID': 3, 'Name': 'Arizona' }, { 'ID': 4, 'Name': 'Arkansas' }, { 'ID': 5, 'Name': 'California' }]; const cities = [{ 'ID': 1, 'Name': 'Tuscaloosa', 'StateID': 1 }, { 'ID': 2, 'Name': 'Hoover', 'StateID': 1 }, { 'ID': 3, 'Name': 'Dothan', 'StateID': 1 }, { 'ID': 4, 'Name': 'Decatur', 'StateID': 1 }, { 'ID': 5, 'Name': 'Anchorage', 'StateID': 2 }, { 'ID': 6, 'Name': 'Fairbanks', 'StateID': 2 }, { 'ID': 7, 'Name': 'Juneau', 'StateID': 2 }, { 'ID': 8, 'Name': 'Avondale', 'StateID': 3 }, { 'ID': 9, 'Name': 'Buckeye', 'StateID': 3 }, { 'ID': 10, 'Name': 'Carefree', 'StateID': 3 }, { 'ID': 11, 'Name': 'Springdale', 'StateID': 4 }, { 'ID': 12, 'Name': 'Rogers', 'StateID': 4 }, { 'ID': 13, 'Name': 'Sherwood', 'StateID': 4 }, { 'ID': 14, 'Name': 'Jacksonville', 'StateID': 4 }, { 'ID': 15, 'Name': 'Cabot', 'StateID': 4 }, { 'ID': 16, 'Name': 'Adelanto', 'StateID': 5 }, { 'ID': 17, 'Name': 'Glendale', 'StateID': 5 }, { 'ID': 18, 'Name': 'Moorpark', 'StateID': 5 }, { 'ID': 19, 'Name': 'Needles', 'StateID': 5 }, { 'ID': 20, 'Name': 'Ontario', 'StateID': 5 }]; export default { getEmployees() { return employees; }, getStates() { return states; }, getCities() { return cities; } };
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { 'react': 'npm:react@16/umd/react.development.js', 'react-dom': 'npm:react-dom@16/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'devextreme': 'npm:devextreme@19.1', 'devextreme-react': 'npm:devextreme-react@19.1', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.6/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' } }, babelOptions: { sourceMaps: false, stage0: true, react: true } });