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
<template> <div id="data-grid-demo"> <dx-data-grid :data-source="employees" :show-borders="true" key-expr="ID" @editorPreparing="onEditorPreparing" > <dx-editing :allow-updating="true" :allow-adding="true" mode="row" /> <dx-column data-field="FirstName" /> <dx-column data-field="LastName" /> <dx-column data-field="Position" /> <dx-column :set-cell-value="setStateValue" data-field="StateID" caption="State" > <dx-lookup :data-source="states" display-expr="Name" value-expr="ID" /> </dx-column> <dx-column data-field="CityID" caption="City" > <dx-lookup :data-source="getFilteredCities" display-expr="Name" value-expr="ID" /> </dx-column> </dx-data-grid> </div> </template> <script> import { DxDataGrid, DxColumn, DxEditing, DxLookup } from 'devextreme-vue/data-grid'; import service from './data.js'; const employees = service.getEmployees(); const states = service.getStates(); const cities = service.getCities(); export default { components: { DxDataGrid, DxColumn, DxEditing, DxLookup }, data() { return { employees, states, setStateValue(rowData, value) { rowData.CityID = null; this.defaultSetCellValue(rowData, value); } }; }, methods: { getFilteredCities: (options) => { return { store: 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'); } } } }; </script> <style> #data-grid-demo { min-height: 700px; } </style>
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', components: { App }, template: '<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.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.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>
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/' }, map: { vue: 'npm:vue@2.6.3/dist/vue.esm.browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@latest/index.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-vue': 'npm:devextreme-vue@19.2', jszip: 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devexpress-gantt': 'npm:devexpress-gantt', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, meta: { '*.vue': { loader: 'vue-loader' } }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });