Your search did not match any results.
Drop Down Box

Single Selection

Documentation

The DropDownBox widget is an editor that consists of a text field and drop-down content. The content can be anything. In this demo, it is the TreeView widget and the DataGrid widget. This demo also illustrates how to implement single selection and how to synchronize the DropDownBox with the nested widgets.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import { DropDownBox, TreeView } from 'devextreme-react'; import DataGrid, { Selection, Paging, FilterRow, Scrolling } from 'devextreme-react/data-grid'; import CustomStore from 'devextreme/data/custom_store'; import 'whatwg-fetch'; class App extends React.Component { constructor(props) { super(props); this.treeView = null; this.treeDataSource = this.makeAsyncDataSource('treeProducts.json'); this.gridDataSource = this.makeAsyncDataSource('customers.json'); this.state = { treeBoxValue: '1_1', gridBoxValue: 3, gridSelectedRowKeys: [3] }; this.treeView_itemSelectionChanged = this.treeView_itemSelectionChanged.bind(this); this.syncTreeViewSelection = this.syncTreeViewSelection.bind(this); this.syncDataGridSelection = this.syncDataGridSelection.bind(this); this.dataGrid_onSelectionChanged = this.dataGrid_onSelectionChanged.bind(this); this.treeViewRender = this.treeViewRender.bind(this); this.treeView_onContentReady = this.treeView_onContentReady.bind(this); this.dataGridRender = this.dataGridRender.bind(this); } makeAsyncDataSource(jsonFile) { return new CustomStore({ loadMode: 'raw', key: 'ID', load: function() { return fetch(`../../../../data/${ jsonFile}`) .then(response => response.json()); } }); } render() { return ( <div className={'dx-fieldset'}> <div className={'dx-field'}> <div className={'dx-field-label'}>DropDownBox with embedded TreeView</div> <div className={'dx-field-value'}> <DropDownBox value={this.state.treeBoxValue} valueExpr={'ID'} displayExpr={'name'} placeholder={'Select a value...'} showClearButton={true} dataSource={this.treeDataSource} onValueChanged={this.syncTreeViewSelection} contentRender={this.treeViewRender} /> </div> </div> <div className={'dx-field'}> <div className={'dx-field-label'}>DropDownBox with embedded DataGrid</div> <div className={'dx-field-value'}> <DropDownBox value={this.state.gridBoxValue} valueExpr={'ID'} deferRendering={false} displayExpr={this.gridBox_displayExpr} placeholder={'Select a value...'} showClearButton={true} dataSource={this.gridDataSource} onValueChanged={this.syncDataGridSelection} contentRender={this.dataGridRender} /> </div> </div> </div> ); } treeViewRender() { return ( <TreeView dataSource={this.treeDataSource} ref={(ref) => this.treeView = ref} dataStructure={'plain'} keyExpr={'ID'} parentIdExpr={'categoryId'} selectionMode={'single'} displayExpr={'name'} selectByClick={true} onContentReady={this.treeView_onContentReady} onItemSelectionChanged={this.treeView_itemSelectionChanged} /> ); } dataGridRender() { return ( <DataGrid dataSource={this.gridDataSource} columns={['CompanyName', 'City', 'Phone']} hoverStateEnabled={true} selectedRowKeys={this.state.gridSelectedRowKeys} onSelectionChanged={this.dataGrid_onSelectionChanged} height={'100%'}> <Selection mode={'single'} /> <Scrolling mode={'infinite'} /> <Paging enabled={true} pageSize={10} /> <FilterRow visible={true} /> </DataGrid> ); } syncTreeViewSelection(e) { this.setState({ treeBoxValue: e.value }); if (!this.treeView) return; if (!e.value) { this.treeView.instance.unselectAll(); } else { this.treeView.instance.selectItem(e.value); } } syncDataGridSelection(e) { this.setState({ gridBoxValue: e.value, gridSelectedRowKeys: !e.value ? [] : [e.value] }); } treeView_itemSelectionChanged(e) { this.setState({ treeBoxValue: e.component.getSelectedNodesKeys() }); } dataGrid_onSelectionChanged(e) { const newValue = e.selectedRowKeys.length && e.selectedRowKeys[0] || null; this.setState({ gridBoxValue: newValue, gridSelectedRowKeys: !newValue ? [] : [newValue] }); } gridBox_displayExpr(item) { return item && `${item.CompanyName } <${ item.Phone }>`; } treeView_onContentReady(e) { e.component.selectItem(this.state.treeBoxValue); } } 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.7/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.7/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>
.dx-fieldset { height: 500px; }
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.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'whatwg-fetch': 'npm:whatwg-fetch@2.0.4/fetch.js', // 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 } });