Your search did not match any results.
Tree List

Web API Service

To access a Web API service from the client, use the createStore method from the DevExtreme.AspNet.Data extension. This extension also allows you to process data for DevExtreme components on the server. The server-side implementation is available under the TreeListTasksController.cs tab in the ASP.NET MVC and ASP.NET Core versions of this demo.

To notify the TreeList that data is processed on the server, set the remoteOperations property to true.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import TreeList, { RemoteOperations, Column, SearchPanel, HeaderFilter, Editing, RequiredRule, Lookup } from 'devextreme-react/tree-list'; import AspNetData from 'devextreme-aspnet-data-nojquery'; const url = 'https://js.devexpress.com/Demos/Mvc/api/TreeListTasks'; const tasksData = AspNetData.createStore({ key: 'Task_ID', loadUrl: `${url}/Tasks`, insertUrl: `${url}/InsertTask`, updateUrl: `${url}/UpdateTask`, deleteUrl: `${url}/DeleteTask`, onBeforeSend: function(method, ajaxOptions) { ajaxOptions.xhrFields = { withCredentials: true }; } }); const employeesData = AspNetData.createStore({ key: 'ID', loadUrl: `${url}/TaskEmployees` }); const statusesData = [ 'Not Started', 'Need Assistance', 'In Progress', 'Deferred', 'Completed' ]; class App extends React.Component { render() { return ( <TreeList id="tree-list" dataSource={tasksData} keyExpr="Task_ID" parentIdExpr="Task_Parent_ID" hasItemsExpr="Has_Items" defaultExpandedRowKeys={[1, 2]} showRowLines={true} showBorders={true} columnAutoWidth={true} wordWrapEnabled={true} onInitNewRow={initNewRow}> <RemoteOperations filtering={true} sorting={true} grouping={true} /> <SearchPanel visible={true} /> <HeaderFilter visible={true} /> <Editing mode="row" allowAdding={true} allowUpdating={true} allowDeleting={true} /> <Column dataField="Task_Subject" minWidth={250}> <RequiredRule /> </Column> <Column dataField="Task_Assigned_Employee_ID" caption="Assigned" minWidth={120}> <Lookup dataSource={employeesData} valueExpr="ID" displayExpr="Name" /> <RequiredRule /> </Column> <Column dataField="Task_Status" caption="Status" minWidth={120}> <Lookup dataSource={statusesData} /> </Column> <Column dataField="Task_Start_Date" caption="Start Date" dataType="date" /> <Column dataField="Task_Due_Date" caption="Due Date" dataType="date" /> </TreeList> ); } } function initNewRow(e) { e.data.Task_Status = 'Not Started'; e.data.Task_Start_Date = new Date(); e.data.Task_Due_Date = new Date(); } 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/21.1.3/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.1.3/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>
#tree-list { max-height: 640px; }
window.config = { transpiler: 'plugin-babel', meta: { 'devextreme/localization.js': { "esModule": true }, 'devextreme-aspnet-data-nojquery': { 'esModule': true }, }, paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { '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@15.7.2/prop-types.js', 'devextreme-aspnet-data-nojquery': 'npm:devextreme-aspnet-data-nojquery@2.8.4/index.js', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.27.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@21.1.3/cjs', 'devextreme-react': 'npm:devextreme-react@21.1.3', 'jszip': 'npm:jszip@3.6.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.0.0/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.15/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@2.1.31/dist/dx-gantt.js', '@devextreme/vdom': 'npm:@devextreme/vdom@1.2.1', 'inferno': 'npm:inferno@7.4.8/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat@7.4.8/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.8/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom@1.0.7/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.8/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode@7.4.8/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class@7.4.8/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras@7.4.8/dist/inferno-extras.min.js', // 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' }, packages: { 'devextreme': { defaultExtension: 'js' }, '@devextreme/vdom': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, packageConfigPaths: [ "npm:@devextreme/*/package.json", ], babelOptions: { sourceMaps: false, stage0: true, react: true } }; System.config(window.config);