If you have technical questions, please create a support ticket in the DevExpress Support Center.
import React, { useCallback, useRef, useState } from 'react';
import DataGrid, { Column, Sorting } from 'devextreme-react/data-grid';
import CheckBox from 'devextreme-react/check-box';
import { employees } from './data.ts';
const App = () => {
const [positionDisableSorting, setPositionDisableSorting] = useState(false);
const dataGridRef = useRef(null);
const onPositionSortingChanged = useCallback(() => {
setPositionDisableSorting((previousPositionDisableSorting) => !previousPositionDisableSorting);
dataGridRef.current.instance().columnOption(5, 'sortOrder', undefined);
}, []);
return (
<div>
<DataGrid
dataSource={employees}
keyExpr="ID"
showBorders={true}
ref={dataGridRef}
>
<Sorting mode="multiple" />
<Column dataField="Prefix" caption="Title" width={100} defaultSortOrder="asc" />
<Column dataField="FirstName" defaultSortOrder="asc" />
<Column dataField="LastName" />
<Column dataField="City" />
<Column dataField="State" />
<Column
dataField="Position"
allowSorting={!positionDisableSorting}
width={130}
/>
<Column dataField="HireDate" dataType="date" />
</DataGrid>
<div className="options">
<div className="caption">Options</div>
<div className="option">
<CheckBox
text="Disable Sorting for the Position Column"
value={positionDisableSorting}
onValueChanged={onPositionSortingChanged}
/>
</div>
</div>
</div>
);
};
export default App;
xxxxxxxxxx
import React, { useCallback, useRef, useState } from 'react';
import DataGrid, { Column, Sorting } from 'devextreme-react/data-grid';
import CheckBox from 'devextreme-react/check-box';
import { employees } from './data.js';
const App = () => {
const [positionDisableSorting, setPositionDisableSorting] = useState(false);
const dataGridRef = useRef(null);
const onPositionSortingChanged = useCallback(() => {
setPositionDisableSorting((previousPositionDisableSorting) => !previousPositionDisableSorting);
dataGridRef.current.instance().columnOption(5, 'sortOrder', undefined);
}, []);
return (
<div>
<DataGrid
dataSource={employees}
keyExpr="ID"
showBorders={true}
ref={dataGridRef}
>
<Sorting mode="multiple" />
<Column
dataField="Prefix"
caption="Title"
width={100}
defaultSortOrder="asc"
/>
<Column
dataField="FirstName"
defaultSortOrder="asc"
/>
<Column dataField="LastName" />
<Column dataField="City" />
<Column dataField="State" />
<Column
dataField="Position"
allowSorting={!positionDisableSorting}
width={130}
/>
<Column
dataField="HireDate"
dataType="date"
/>
</DataGrid>
<div className="options">
<div className="caption">Options</div>
<div className="option">
<CheckBox
text="Disable Sorting for the Position Column"
value={positionDisableSorting}
onValueChanged={onPositionSortingChanged}
/>
</div>
</div>
</div>
);
};
export default App;
xxxxxxxxxx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.tsx';
ReactDOM.render(
<App />,
document.getElementById('app'),
);
xxxxxxxxxx
export const employees = [{
ID: 1,
FirstName: 'John',
LastName: 'Heart',
Phone: '(213) 555-9392',
Prefix: 'Mr.',
Position: 'CEO',
BirthDate: '1964-03-16',
HireDate: '1995-01-15',
Email: 'jheart@dx-email.com',
Address: '351 S Hill St.',
City: 'Los Angeles',
StateID: 5,
State: 'California',
HomePhone: '(213) 555-9208',
Skype: 'jheartDXskype',
}, {
ID: 2,
FirstName: 'Olivia',
LastName: 'Peyton',
Phone: '(310) 555-2728',
Prefix: 'Mrs.',
Position: 'Sales Assistant',
BirthDate: '1981-06-03',
HireDate: '2012-05-14',
Email: 'oliviap@dx-email.com',
Address: '807 W Paseo Del Mar',
City: 'Los Angeles',
StateID: 5,
State: 'California',
HomePhone: '(310) 555-4547',
Skype: 'oliviapDXskype',
}, {
ID: 3,
FirstName: 'Robert',
LastName: 'Reagan',
Phone: '(818) 555-2387',
Prefix: 'Mr.',
Position: 'CMO',
BirthDate: '1974-09-07',
HireDate: '2002-11-08',
Email: 'robertr@dx-email.com',
Address: '4 Westmoreland Pl.',
City: 'Bentonville',
StateID: 4,
State: 'Arkansas',
HomePhone: '(818) 555-2438',
Skype: 'robertrDXskype',
}, {
ID: 4,
FirstName: 'Greta',
LastName: 'Sims',
Phone: '(818) 555-6546',
Prefix: 'Ms.',
Position: 'HR Manager',
BirthDate: '1977-11-22',
HireDate: '1998-04-23',
Email: 'gretas@dx-email.com',
Address: '1700 S Grandview Dr.',
City: 'Atlanta',
StateID: 11,
State: 'Georgia',
HomePhone: '(818) 555-0976',
Skype: 'gretasDXskype',
}, {
ID: 5,
FirstName: 'Brett',
LastName: 'Wade',
Phone: '(626) 555-0358',
Prefix: 'Mr.',
Position: 'IT Manager',
BirthDate: '1968-12-01',
HireDate: '2009-03-06',
Email: 'brettw@dx-email.com',
Address: '1120 Old Mill Rd.',
City: 'Boise',
StateID: 13,
State: 'Idaho',
HomePhone: '(626) 555-5985',
Skype: 'brettwDXskype',
}, {
ID: 6,
FirstName: 'Sandra',
LastName: 'Johnson',
Phone: '(562) 555-2082',
Prefix: 'Mrs.',
Position: 'Controller',
BirthDate: '1974-11-15',
HireDate: '2005-05-11',
Email: 'sandraj@dx-email.com',
Address: '4600 N Virginia Rd.',
City: 'Beaver',
StateID: 44,
State: 'Utah',
HomePhone: '(562) 555-8272',
Skype: 'sandrajDXskype',
}, {
ID: 7,
FirstName: 'Kevin',
LastName: 'Carter',
Phone: '(213) 555-2840',
Prefix: 'Mr.',
Position: 'Shipping Manager',
BirthDate: '1978-01-09',
HireDate: '2009-08-11',
Email: 'kevinc@dx-email.com',
Address: '424 N Main St.',
City: 'San Diego',
StateID: 5,
State: 'California',
HomePhone: '(213) 555-8038',
Skype: 'kevincDXskype',
}, {
ID: 8,
FirstName: 'Cynthia',
LastName: 'Stanwick',
Phone: '(818) 555-6655',
Prefix: 'Ms.',
Position: 'HR Assistant',
BirthDate: '1985-06-05',
HireDate: '2008-03-24',
Email: 'cindys@dx-email.com',
Address: '2211 Bonita Dr.',
City: 'Little Rock',
StateID: 4,
State: 'Arkansas',
HomePhone: '(818) 555-6808',
Skype: 'cindysDXskype',
}, {
ID: 9,
FirstName: 'Kent',
LastName: 'Samuelson',
Phone: '(562) 555-9282',
Prefix: 'Dr.',
Position: 'Ombudsman',
BirthDate: '1972-09-11',
HireDate: '2009-04-22',
Email: 'kents@dx-email.com',
Address: '12100 Mora Dr',
City: 'St. Louis',
StateID: 26,
State: 'Missouri',
HomePhone: '(562) 555-1328',
Skype: 'kentsDXskype',
}, {
ID: 10,
FirstName: 'Taylor',
LastName: 'Riley',
Phone: '(310) 555-7276',
Prefix: 'Mr.',
Position: 'Network Admin',
BirthDate: '1982-08-14',
HireDate: '2012-04-14',
Email: 'taylorr@dx-email.com',
Address: '7776 Torreyson Dr',
City: 'San Jose',
StateID: 5,
State: 'California',
HomePhone: '(310) 555-9712',
Skype: 'taylorrDXskype',
}];
xxxxxxxxxx
window.exports = window.exports || {};
window.config = {
transpiler: 'ts',
typescriptOptions: {
module: 'system',
emitDecoratorMetadata: true,
experimentalDecorators: true,
jsx: 'react',
},
meta: {
'react': {
'esModule': true,
},
'typescript': {
'exports': 'ts',
},
'devextreme/time_zone_utils.js': {
'esModule': true,
},
'devextreme/localization.js': {
'esModule': true,
},
'devextreme/viz/palette.js': {
'esModule': true,
},
'openai': {
'esModule': true,
},
},
paths: {
'npm:': 'https://unpkg.com/',
'bundles:': 'bundles/',
'externals:': 'bundles/externals/',
},
defaultExtension: 'js',
map: {
'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js',
'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
'react': 'npm:react@17.0.2/umd/react.development.js',
'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js',
'prop-types': 'npm:prop-types/prop-types.js',
'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js',
'es6-object-assign': 'npm:es6-object-assign',
'devextreme': 'npm:devextreme@24.2.5/cjs',
'devextreme-react': 'npm:devextreme-react@24.2.5/cjs',
'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.54/dist/dx-gantt.js',
'@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12',
'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js',
'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js',
'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js',
'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js',
'inferno-hydrate': 'npm:inferno-hydrate/dist/inferno-hydrate.min.js',
'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js',
'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js',
'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js',
'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3',
// SystemJS plugins
'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',
// Prettier
'prettier/standalone': 'npm:prettier@2.8.8/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
},
packages: {
'devextreme': {
defaultExtension: 'js',
},
'devextreme-react': {
main: 'index.js',
},
'devextreme/events/utils': {
main: 'index',
},
'devextreme/localization/messages': {
format: 'json',
defaultExtension: 'json',
},
'devextreme/events': {
main: 'index',
},
'es6-object-assign': {
main: './index.js',
defaultExtension: 'js',
},
},
packageConfigPaths: [
'npm:@devextreme/*/package.json',
'npm:@devextreme/runtime@3.0.12/inferno/package.json',
],
babelOptions: {
sourceMaps: false,
stage0: true,
react: true,
},
};
System.config(window.config);
xxxxxxxxxx
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.js';
ReactDOM.render(<App />, document.getElementById('app'));
xxxxxxxxxx
export const employees = [
{
ID: 1,
FirstName: 'John',
LastName: 'Heart',
Phone: '(213) 555-9392',
Prefix: 'Mr.',
Position: 'CEO',
BirthDate: '1964-03-16',
HireDate: '1995-01-15',
Email: 'jheart@dx-email.com',
Address: '351 S Hill St.',
City: 'Los Angeles',
StateID: 5,
State: 'California',
HomePhone: '(213) 555-9208',
Skype: 'jheartDXskype',
},
{
ID: 2,
FirstName: 'Olivia',
LastName: 'Peyton',
Phone: '(310) 555-2728',
Prefix: 'Mrs.',
Position: 'Sales Assistant',
BirthDate: '1981-06-03',
HireDate: '2012-05-14',
Email: 'oliviap@dx-email.com',
Address: '807 W Paseo Del Mar',
City: 'Los Angeles',
StateID: 5,
State: 'California',
HomePhone: '(310) 555-4547',
Skype: 'oliviapDXskype',
},
{
ID: 3,
FirstName: 'Robert',
LastName: 'Reagan',
Phone: '(818) 555-2387',
Prefix: 'Mr.',
Position: 'CMO',
BirthDate: '1974-09-07',
HireDate: '2002-11-08',
Email: 'robertr@dx-email.com',
Address: '4 Westmoreland Pl.',
City: 'Bentonville',
StateID: 4,
State: 'Arkansas',
HomePhone: '(818) 555-2438',
Skype: 'robertrDXskype',
},
{
ID: 4,
FirstName: 'Greta',
LastName: 'Sims',
Phone: '(818) 555-6546',
Prefix: 'Ms.',
Position: 'HR Manager',
BirthDate: '1977-11-22',
HireDate: '1998-04-23',
Email: 'gretas@dx-email.com',
Address: '1700 S Grandview Dr.',
City: 'Atlanta',
StateID: 11,
State: 'Georgia',
HomePhone: '(818) 555-0976',
Skype: 'gretasDXskype',
},
{
ID: 5,
FirstName: 'Brett',
LastName: 'Wade',
Phone: '(626) 555-0358',
Prefix: 'Mr.',
Position: 'IT Manager',
BirthDate: '1968-12-01',
HireDate: '2009-03-06',
Email: 'brettw@dx-email.com',
Address: '1120 Old Mill Rd.',
City: 'Boise',
StateID: 13,
State: 'Idaho',
HomePhone: '(626) 555-5985',
Skype: 'brettwDXskype',
},
{
ID: 6,
FirstName: 'Sandra',
LastName: 'Johnson',
Phone: '(562) 555-2082',
Prefix: 'Mrs.',
Position: 'Controller',
BirthDate: '1974-11-15',
HireDate: '2005-05-11',
Email: 'sandraj@dx-email.com',
Address: '4600 N Virginia Rd.',
City: 'Beaver',
StateID: 44,
State: 'Utah',
HomePhone: '(562) 555-8272',
Skype: 'sandrajDXskype',
},
{
ID: 7,
FirstName: 'Kevin',
LastName: 'Carter',
Phone: '(213) 555-2840',
Prefix: 'Mr.',
Position: 'Shipping Manager',
BirthDate: '1978-01-09',
HireDate: '2009-08-11',
Email: 'kevinc@dx-email.com',
Address: '424 N Main St.',
City: 'San Diego',
StateID: 5,
State: 'California',
HomePhone: '(213) 555-8038',
Skype: 'kevincDXskype',
},
{
ID: 8,
FirstName: 'Cynthia',
LastName: 'Stanwick',
Phone: '(818) 555-6655',
Prefix: 'Ms.',
Position: 'HR Assistant',
BirthDate: '1985-06-05',
HireDate: '2008-03-24',
Email: 'cindys@dx-email.com',
Address: '2211 Bonita Dr.',
City: 'Little Rock',
StateID: 4,
State: 'Arkansas',
HomePhone: '(818) 555-6808',
Skype: 'cindysDXskype',
},
{
ID: 9,
FirstName: 'Kent',
LastName: 'Samuelson',
Phone: '(562) 555-9282',
Prefix: 'Dr.',
Position: 'Ombudsman',
BirthDate: '1972-09-11',
HireDate: '2009-04-22',
Email: 'kents@dx-email.com',
Address: '12100 Mora Dr',
City: 'St. Louis',
StateID: 26,
State: 'Missouri',
HomePhone: '(562) 555-1328',
Skype: 'kentsDXskype',
},
{
ID: 10,
FirstName: 'Taylor',
LastName: 'Riley',
Phone: '(310) 555-7276',
Prefix: 'Mr.',
Position: 'Network Admin',
BirthDate: '1982-08-14',
HireDate: '2012-04-14',
Email: 'taylorr@dx-email.com',
Address: '7776 Torreyson Dr',
City: 'San Jose',
StateID: 5,
State: 'California',
HomePhone: '(310) 555-9712',
Skype: 'taylorrDXskype',
},
];
xxxxxxxxxx
<html lang="en">
<head></head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"></div>
</div>
</body>
</html>
xxxxxxxxxx
.options {
padding: 20px;
margin-top: 20px;
background-color: rgba(191, 191, 191, 0.15);
}
.caption {
font-size: 18px;
font-weight: 500;
}
.option {
margin-top: 10px;
}
-
Single sort mode
A user can click the column header to sort by this column and click it again to change the sort order (ascending or descending). An arrow icon in the column's header indicates the sort order. -
Multiple sort mode
A user can hold the Shift key and click column headers in the order the user wants to apply sorting. A number in the column's header indicates the sort index. To cancel a column's sort settings, a user should hold the Ctrl key and click the column header.
A user can also apply or cancel sort settings in the column header's context menu. To disallow a user to sort by a particular column, set the column's allowSorting property to false.
To specify the initial sort settings, use the column's sortOrder and sortIndex properties. You can also use these properties to change sort settings at runtime, as shown in this demo.