Your search did not match any results.
Data Grid

Toolbar Customization

The DataGrid uses an integrated DevExtreme Toolbar component to display predefined and custom commands. To add or remove toolbar items, implement the onToolbarPreparing function. Use its parameter's toolbarOptions field to access the Toolbar's configuration object. This object includes the command collection: the toolbarOptions.items array.

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

  • DevExtreme widgets
    Specify a widget that you want to add and its options. In this demo, we extended the toolbar's item collection with a Button and a SelectBox.

  • Custom elements
    Specify a template for your custom element. In this demo, the custom element displays the total group count.

  • Predefined controls
    The availability of predefined controls depends on whether a specific DataGrid feature is enabled. For example, this demo enables the columnChooser, and the toolbar displays the Column Chooser button. You can customize the predefined controls in the onToolbarPreparing function. Refer to its description for a code example.

Copy to CodeSandBox
Apply
Reset
<template> <DxDataGrid id="gridContainer" :ref="gridRefName" :data-source="orders" :show-borders="true" @toolbar-preparing="onToolbarPreparing($event)" > <DxGrouping :auto-expand-all="expanded"/> <DxColumnChooser :enabled="true"/> <DxLoadPanel :enabled="true"/> <DxColumn data-field="OrderNumber" caption="Invoice Number" /> <DxColumn data-field="OrderDate"/> <DxColumn data-field="Employee"/> <DxColumn data-field="CustomerStoreCity" caption="City" /> <DxColumn :group-index="0" data-field="CustomerStoreState" caption="State" /> <DxColumn data-field="SaleAmount" alignment="right" format="currency" /> <template #totalGroupCount="{ data }"> <div class="informer"> <h2 class="count">{{ totalCount }}</h2> <span class="name">Total Count</span> </div> </template> </DxDataGrid> </template> <script> import { DxDataGrid, DxColumn, DxGrouping, DxColumnChooser, DxLoadPanel } from 'devextreme-vue/data-grid'; import query from 'devextreme/data/query'; import service from './data.js'; export default { components: { DxDataGrid, DxColumn, DxGrouping, DxColumnChooser, DxLoadPanel }, data() { return { orders: service.getOrders(), gridRefName: 'dataGrid', expanded: true, totalCount: 0 }; }, created() { this.totalCount = this.getGroupCount('CustomerStoreState'); }, methods: { getGroupCount(groupField) { return query(this.orders) .groupBy(groupField) .toArray().length; }, onToolbarPreparing(e) { e.toolbarOptions.items.unshift({ location: 'before', template: 'totalGroupCount' }, { location: 'before', widget: 'dxSelectBox', options: { width: 200, items: [{ value: 'CustomerStoreState', text: 'Grouping by State' }, { value: 'Employee', text: 'Grouping by Employee' }], displayExpr: 'text', valueExpr: 'value', value: 'CustomerStoreState', onValueChanged: this.groupChanged.bind(this) } }, { location: 'before', widget: 'dxButton', options: { width: 136, text: 'Collapse All', onClick: this.collapseAllClick.bind(this) } }, { location: 'after', widget: 'dxButton', options: { icon: 'refresh', onClick: this.refreshDataGrid.bind(this) } }); }, groupChanged(e) { this.$refs[this.gridRefName].instance.clearGrouping(); this.$refs[this.gridRefName].instance.columnOption(e.value, 'groupIndex', 0); this.totalCount = this.getGroupCount(e.value); }, collapseAllClick(e) { this.expanded = !this.expanded; e.component.option({ text: this.expanded ? 'Collapse All' : 'Expand All' }); }, refreshDataGrid() { this.$refs[this.gridRefName].instance.refresh(); } } }; </script> <style scoped> .dx-datagrid-header-panel { padding: 0; background-color: rgba(85, 149, 222, 0.6); } .dx-datagrid-header-panel .dx-toolbar { margin: 0; padding-right: 20px; background-color: transparent; } .dx-datagrid-header-panel .dx-toolbar-items-container { height: 70px; } .dx-datagrid-header-panel .dx-toolbar-before .dx-toolbar-item:not(:first-child) { background-color: rgba(103, 171, 255, 0.6); } .dx-datagrid-header-panel .dx-toolbar-before .dx-toolbar-item:last-child { padding-right: 10px; } .dx-datagrid-header-panel .dx-selectbox { margin: 17px 10px; } .dx-datagrid-header-panel .dx-button { margin: 17px 0; } .informer { height: 70px; width: 130px; text-align: center; color: #fff; } .count { padding-top: 15px; line-height: 27px; margin: 0; } </style>
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#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/20.2.3/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.2.3/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> </body> </html>
let orders = [{ 'ID' : 1, 'OrderNumber' : 35703, 'OrderDate' : new Date(2014, 3, 10), 'SaleAmount' : 11800, 'Terms' : '15 Days', 'TotalAmount' : 12175, 'CustomerStoreState' : 'California', 'CustomerStoreCity' : 'Los Angeles', 'Employee' : 'Harv Mudd' }, { 'ID' : 4, 'OrderNumber' : 35711, 'OrderDate' : new Date(2014, 0, 12), 'SaleAmount' : 16050, 'Terms' : '15 Days', 'TotalAmount' : 16550, 'CustomerStoreState' : 'California', 'CustomerStoreCity' : 'San Jose', 'Employee' : 'Jim Packard' }, { 'ID' : 5, 'OrderNumber' : 35714, 'OrderDate' : new Date(2014, 0, 22), 'SaleAmount' : 14750, 'Terms' : '15 Days', 'TotalAmount' : 15250, 'CustomerStoreState' : 'Nevada', 'CustomerStoreCity' : 'Las Vegas', 'Employee' : 'Harv Mudd' }, { 'ID' : 7, 'OrderNumber' : 35983, 'OrderDate' : new Date(2014, 1, 7), 'SaleAmount' : 3725, 'Terms' : '15 Days', 'TotalAmount' : 3850, 'CustomerStoreState' : 'Colorado', 'CustomerStoreCity' : 'Denver', 'Employee' : 'Todd Hoffman' }, { 'ID' : 9, 'OrderNumber' : 36987, 'OrderDate' : new Date(2014, 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(2014, 2, 1), 'SaleAmount' : 7800, 'Terms' : '15 Days', 'TotalAmount' : 8200, 'CustomerStoreState' : 'California', 'CustomerStoreCity' : 'Los Angeles', 'Employee' : 'Harv Mudd' }, { 'ID' : 14, 'OrderNumber' : 39420, 'OrderDate' : new Date(2014, 1, 15), 'SaleAmount' : 20500, 'Terms' : '15 Days', 'TotalAmount' : 9100, 'CustomerStoreState' : 'California', 'CustomerStoreCity' : 'San Jose', 'Employee' : 'Jim Packard' }, { 'ID' : 15, 'OrderNumber' : 39874, 'OrderDate' : new Date(2014, 1, 4), 'SaleAmount' : 9050, 'Terms' : '30 Days', 'TotalAmount' : 19100, 'CustomerStoreState' : 'Nevada', 'CustomerStoreCity' : 'Las Vegas', 'Employee' : 'Harv Mudd' }, { 'ID' : 18, 'OrderNumber' : 42847, 'OrderDate' : new Date(2014, 1, 15), 'SaleAmount' : 20400, 'Terms' : '30 Days', 'TotalAmount' : 20800, 'CustomerStoreState' : 'Wyoming', 'CustomerStoreCity' : 'Casper', 'Employee' : 'Todd Hoffman' }, { 'ID' : 19, 'OrderNumber' : 43982, 'OrderDate' : new Date(2014, 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(2014, 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(2013, 11, 31), 'SaleAmount' : 11050, 'Terms' : '30 Days', 'TotalAmount' : 11400, 'CustomerStoreState' : 'Arizona', 'CustomerStoreCity' : 'Phoenix', 'Employee' : 'Clark Morgan' }]; export default { getOrders() { return orders; } };
System.config({ transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader' }, }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'vue': 'npm:vue@3.0.0/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.0.15/index.js', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.25.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@20.2.3', 'devextreme-vue': 'npm:devextreme-vue@20.2.3', 'jszip': 'npm:jszip@3.5.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@0.9.5/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.0.0/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@2.0.0/dist/dx-gantt.js', 'preact': 'npm:preact@10.5.5/dist/preact.js', 'preact/hooks': 'npm:preact@10.5.5/hooks/dist/hooks.js', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js' }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });