DevExtreme v26.1 is now available.

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

Your search did not match any results.

React Data Grid - Toolbar

The DataGrid includes an integrated toolbar that displays predefined and custom controls. To add or remove toolbar items, declare the toolbar.items[] array.

If toolbar.items[] is specified, DataGrid does not display controls missing from the array. Ensure this array includes controls for all enabled features.

Backend API
import React, { useCallback, useMemo, useRef, useState } from 'react'; import SelectBox, { type SelectBoxTypes } from 'devextreme-react/select-box'; import DataGrid, { Grouping, Column, ColumnChooser, LoadPanel, Toolbar, Item, } from 'devextreme-react/data-grid'; import type { DataGridRef } from 'devextreme-react/data-grid'; import { query } from 'devextreme-react/common/data'; import { orders } from './data.ts'; const countLabel = { 'aria-label': 'Count' }; const groupingValues = [{ value: 'CustomerStoreState', text: 'Grouping by State', }, { value: 'Employee', text: 'Grouping by Employee', }]; const getGroupCount = (groupField: string) => query(orders).groupBy(groupField).toArray().length; const App = () => { const [expandAll, setExpandAll] = useState(true); const [totalCount, setTotalCount] = useState(getGroupCount('CustomerStoreState')); const [groupColumn, setGroupColumn] = useState('CustomerStoreState'); const dataGridRef = useRef<DataGridRef>(null); const toggleGroupColumn = useCallback((e: SelectBoxTypes.ValueChangedEvent) => { const newGrouping = e.value; dataGridRef.current?.instance().clearGrouping(); dataGridRef.current?.instance().columnOption(newGrouping, 'groupIndex', 0); setTotalCount(getGroupCount(newGrouping)); setGroupColumn(newGrouping); }, []); const toggleExpandAll = useCallback(() => { setExpandAll(!expandAll); }, [expandAll]); const toggleButtonOptions = useMemo(() => ({ text: expandAll ? 'Collapse All' : 'Expand All', width: 136, onClick: () => toggleExpandAll(), }), [expandAll, toggleExpandAll]); const refreshButtonOptions = useMemo(() => ({ icon: 'refresh', text: 'Refresh', onClick: () => { dataGridRef.current?.instance().refresh(); }, }), []); return ( <DataGrid id="gridContainer" ref={dataGridRef} dataSource={orders} keyExpr="ID" showBorders={true}> <Grouping autoExpandAll={expandAll} /> <ColumnChooser enabled={true} /> <LoadPanel enabled={true} /> <Column dataField="OrderNumber" caption="Invoice Number" /> <Column dataField="OrderDate" /> <Column dataField="Employee" /> <Column dataField="CustomerStoreCity" caption="City" /> <Column dataField="CustomerStoreState" caption="State" groupIndex={0} /> <Column dataField="SaleAmount" alignment="right" format="currency" /> <Toolbar> <Item location="before"> <div className="informer"> <div className="count">{totalCount}</div> <span>Total Count</span> </div> </Item> <Item location="before" locateInMenu="auto"> <SelectBox width="225" items={groupingValues} displayExpr="text" inputAttr={countLabel} valueExpr="value" value={groupColumn} onValueChanged={toggleGroupColumn} /> </Item> <Item location="before" locateInMenu="auto" widget="dxButton" options={toggleButtonOptions} /> <Item location="after" locateInMenu="auto" showText="inMenu" widget="dxButton" options={refreshButtonOptions} /> <Item name="columnChooserButton" /> </Toolbar> </DataGrid> ); }; export default App;
import React, { useCallback, useMemo, useRef, useState, } from 'react'; import SelectBox from 'devextreme-react/select-box'; import DataGrid, { Grouping, Column, ColumnChooser, LoadPanel, Toolbar, Item, } from 'devextreme-react/data-grid'; import { query } from 'devextreme-react/common/data'; import { orders } from './data.js'; const countLabel = { 'aria-label': 'Count' }; const groupingValues = [ { value: 'CustomerStoreState', text: 'Grouping by State', }, { value: 'Employee', text: 'Grouping by Employee', }, ]; const getGroupCount = (groupField) => query(orders).groupBy(groupField).toArray().length; const App = () => { const [expandAll, setExpandAll] = useState(true); const [totalCount, setTotalCount] = useState(getGroupCount('CustomerStoreState')); const [groupColumn, setGroupColumn] = useState('CustomerStoreState'); const dataGridRef = useRef(null); const toggleGroupColumn = useCallback((e) => { const newGrouping = e.value; dataGridRef.current?.instance().clearGrouping(); dataGridRef.current?.instance().columnOption(newGrouping, 'groupIndex', 0); setTotalCount(getGroupCount(newGrouping)); setGroupColumn(newGrouping); }, []); const toggleExpandAll = useCallback(() => { setExpandAll(!expandAll); }, [expandAll]); const toggleButtonOptions = useMemo( () => ({ text: expandAll ? 'Collapse All' : 'Expand All', width: 136, onClick: () => toggleExpandAll(), }), [expandAll, toggleExpandAll], ); const refreshButtonOptions = useMemo( () => ({ icon: 'refresh', text: 'Refresh', onClick: () => { dataGridRef.current?.instance().refresh(); }, }), [], ); return ( <DataGrid id="gridContainer" ref={dataGridRef} dataSource={orders} keyExpr="ID" showBorders={true} > <Grouping autoExpandAll={expandAll} /> <ColumnChooser enabled={true} /> <LoadPanel enabled={true} /> <Column dataField="OrderNumber" caption="Invoice Number" /> <Column dataField="OrderDate" /> <Column dataField="Employee" /> <Column dataField="CustomerStoreCity" caption="City" /> <Column dataField="CustomerStoreState" caption="State" groupIndex={0} /> <Column dataField="SaleAmount" alignment="right" format="currency" /> <Toolbar> <Item location="before"> <div className="informer"> <div className="count">{totalCount}</div> <span>Total Count</span> </div> </Item> <Item location="before" locateInMenu="auto" > <SelectBox width="225" items={groupingValues} displayExpr="text" inputAttr={countLabel} valueExpr="value" value={groupColumn} onValueChanged={toggleGroupColumn} /> </Item> <Item location="before" locateInMenu="auto" widget="dxButton" options={toggleButtonOptions} /> <Item location="after" locateInMenu="auto" showText="inMenu" widget="dxButton" options={refreshButtonOptions} /> <Item name="columnChooserButton" /> </Toolbar> </DataGrid> ); }; export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
export const orders = [{ ID: 1, OrderNumber: 35703, OrderDate: new Date(2024, 3, 10), SaleAmount: 11800, Terms: '15 Days', TotalAmount: 12175, CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 4, OrderNumber: 35711, OrderDate: new Date(2024, 0, 12), SaleAmount: 16050, Terms: '15 Days', TotalAmount: 16550, CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 5, OrderNumber: 35714, OrderDate: new Date(2024, 0, 22), SaleAmount: 14750, Terms: '15 Days', TotalAmount: 15250, CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 7, OrderNumber: 35983, OrderDate: new Date(2024, 1, 7), SaleAmount: 3725, Terms: '15 Days', TotalAmount: 3850, CustomerStoreState: 'Colorado', CustomerStoreCity: 'Denver', Employee: 'Todd Hoffman', }, { ID: 9, OrderNumber: 36987, OrderDate: new Date(2024, 2, 11), SaleAmount: 14200, Terms: '15 Days', TotalAmount: 14800, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 11, OrderNumber: 38466, OrderDate: new Date(2024, 2, 1), SaleAmount: 7800, Terms: '15 Days', TotalAmount: 8200, CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 14, OrderNumber: 39420, OrderDate: new Date(2024, 1, 15), SaleAmount: 20500, Terms: '15 Days', TotalAmount: 9100, CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 15, OrderNumber: 39874, OrderDate: new Date(2024, 1, 4), SaleAmount: 9050, Terms: '30 Days', TotalAmount: 19100, CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 18, OrderNumber: 42847, OrderDate: new Date(2024, 1, 15), SaleAmount: 20400, Terms: '30 Days', TotalAmount: 20800, CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 19, OrderNumber: 43982, OrderDate: new Date(2024, 4, 29), SaleAmount: 6050, Terms: '30 Days', TotalAmount: 6250, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 29, OrderNumber: 56272, OrderDate: new Date(2024, 1, 6), SaleAmount: 15850, Terms: '30 Days', TotalAmount: 16350, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 30, OrderNumber: 57429, OrderDate: new Date(2023, 11, 31), SaleAmount: 11050, Terms: '30 Days', TotalAmount: 11400, CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }];
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const orders = [ { ID: 1, OrderNumber: 35703, OrderDate: new Date(2024, 3, 10), SaleAmount: 11800, Terms: '15 Days', TotalAmount: 12175, CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 4, OrderNumber: 35711, OrderDate: new Date(2024, 0, 12), SaleAmount: 16050, Terms: '15 Days', TotalAmount: 16550, CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 5, OrderNumber: 35714, OrderDate: new Date(2024, 0, 22), SaleAmount: 14750, Terms: '15 Days', TotalAmount: 15250, CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 7, OrderNumber: 35983, OrderDate: new Date(2024, 1, 7), SaleAmount: 3725, Terms: '15 Days', TotalAmount: 3850, CustomerStoreState: 'Colorado', CustomerStoreCity: 'Denver', Employee: 'Todd Hoffman', }, { ID: 9, OrderNumber: 36987, OrderDate: new Date(2024, 2, 11), SaleAmount: 14200, Terms: '15 Days', TotalAmount: 14800, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 11, OrderNumber: 38466, OrderDate: new Date(2024, 2, 1), SaleAmount: 7800, Terms: '15 Days', TotalAmount: 8200, CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 14, OrderNumber: 39420, OrderDate: new Date(2024, 1, 15), SaleAmount: 20500, Terms: '15 Days', TotalAmount: 9100, CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 15, OrderNumber: 39874, OrderDate: new Date(2024, 1, 4), SaleAmount: 9050, Terms: '30 Days', TotalAmount: 19100, CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 18, OrderNumber: 42847, OrderDate: new Date(2024, 1, 15), SaleAmount: 20400, Terms: '30 Days', TotalAmount: 20800, CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 19, OrderNumber: 43982, OrderDate: new Date(2024, 4, 29), SaleAmount: 6050, Terms: '30 Days', TotalAmount: 6250, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 29, OrderNumber: 56272, OrderDate: new Date(2024, 1, 6), SaleAmount: 15850, Terms: '30 Days', TotalAmount: 16350, CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 30, OrderNumber: 57429, OrderDate: new Date(2023, 11, 31), SaleAmount: 11050, Terms: '30 Days', TotalAmount: 11400, CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }, ];
<!DOCTYPE html> <html 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/26.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="./bundle.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> <script src="bundles/vendor/react.vendor.js"></script> <script src="./bundle.js"></script> </body> </html>
#gridContainer .informer { display: grid; width: 120px; grid-template-columns: 100%; padding-right: 20px; text-align: center; } #gridContainer .count { font-size: 18px; font-weight: 500; } #gridContainer .dx-toolbar-items-container { min-height: 44px; }

This demo illustrates how to add the following items to the toolbar:

  • Predefined Controls
    Declare a toolbar item element and specify the name and properties that you want to customize. If a control does not need customization, include its name only. Ensure that items[] contain controls for all features that you enabled in your DataGrid. In this demo, we enable the columnChooser and add the "columnChooserButton" to the items[] array.

  • DevExtreme Components
    Configure the desired DevExtreme component within a toolbar item element. In this demo, we extended the toolbar's item collection with a Button and a SelectBox.

  • Custom Elements
    Specify a rendering function or a custom component for your custom element within a toolbar item.