JavaScript/jQuery Sortable Options
This section describes properties that configure Sortable UI component content, behavior, and appearance.
See Also
allowDropInsideItem
allowReordering
This property limits row reordering to the UI and does not affect the data source. You should also handle the effects of the drag and drop to the data source in code. If users reorder items inside a single component, implement the onReorder handler.
To configure drag and drop between components, follow the instructions from the group topic.
dragTemplate
Name | Type | Description |
---|---|---|
fromIndex |
The item's original position. |
|
itemData | any |
The item's data. Note that you should specify the item data manually. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
jQuery
$(function() { var treeView = $("#simple-treeview").dxTreeView({ items: treeViewItems, dataStructure: "plain", <!-- ... --> }).dxTreeView("instance"); $("#simple-treeview").dxSortable({ filter: ".dx-treeview-item", allowReordering: true, dragTemplate: dragTemplateFunc, onDragChange: function (e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } }); }); function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; }
<div class="demo-container"> <div class="form"> <div id="simple-treeview"></div> </div> </div>
Angular
import { DxSortableModule, DxTreeViewModule } from "devextreme-angular"; // ... export class AppComponent { onDragChange(e){ e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } @NgModule({ imports: [ // ... DxSortableModule, DxTreeViewModule ], // ... })
<dx-sortable filter=".dx-treeview-item" [allowReordering]="true" (onDragChange)="onDragChange($event)" dragTemplate="myDragTemplate" > <div *dxTemplate="let e of 'myDragTemplate'"> <div>{{ e.itemData + " drag template" }}</div> </div> <dx-tree-view id="simple-treeview" [items]="treeViewItems" dataStructure="plain" ...> </dx-tree-view> </dx-sortable>
Vue
<template> <DxSortable filter=".dx-treeview-item" :allow-reordering="true" @drag-change="onDragChange" drag-template="myDragTemplate" > <template #myDragTemplate="{ data }"> <div>{{ data.itemData.Task_Subject}} + "drag template"</div> </template> <DxTreeView id="simple-treeview" data-structure="plain" :items="treeViewItems" /> </DxSortable> </template> <script> import DxTreeView from 'devextreme-vue/tree-view'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable, DxTreeView }, methods: { onDragChange(e) { e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } } </script>
React
import React from 'react'; import TreeView from 'devextreme-react/tree-view'; import Sortable from 'devextreme-react/sortable'; import { Template } from 'devextreme-react/core/template'; function myDragTemplate(e) { return ( e.itemData + " drag template"; ); } class App extends React.Component { constructor(props) { //... } render() { return ( <Sortable filter=".dx-treeview-item" allowReordering={true} onDragChange={this.onDragChange} dragTemplate={myDragTemplate}> <TreeView id="simple-treeview" dataStructure="plain" items={this.state.treeViewItems} /> </Sortable> ); } onDragChange = (e) => { e.itemData = this.state.treeViewItems[e.fromIndex].name; // your code } } export default App;
ASP.NET Core Controls
@(Html.DevExtreme().Sortable() .Filter(".dx-treeview-item") .AllowReordering(true) .OnDragChange("onDragChange") .DragTemplate(new JS("dragTemplateFunc")) .Content( Html.DevExtreme().TreeView() .ID("simple-treeview") .DataStructure(TreeViewDataStructure.Plain) .DataSource(d => d.Mvc().LoadAction("GetPlainDataForDragAndDrop")) .DataSourceOptions(o => o.Map("mapIcons")) ) ) <script> function onDragChange(e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; } </script>
dropFeedbackMode
This property accepts the following values:
"push"
Items move apart with an animation, allowing room for the dragged item to be placed. To use this mode, ensure that the allowDropInsideItem is disabled."indicate"
Items are not animated and a blue square appears at the place where the dragged item is going to be placed. The source item remains in place - only the cloned item is dragged.
elementAttr
Specifies the global attributes to be attached to the UI component's container element.
jQuery
$(function(){ $("#sortableContainer").dxSortable({ // ... elementAttr: { id: "elementId", class: "class-name" } }); });
Angular
<dx-sortable ... [elementAttr]="{ id: 'elementId', class: 'class-name' }"> </dx-sortable>
import { DxSortableModule } from "devextreme-angular"; // ... export class AppComponent { // ... } @NgModule({ imports: [ // ... DxSortableModule ], // ... })
Vue
<template> <DxSortable ... :element-attr="sortableAttributes"> </DxSortable> </template> <script> import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable }, data() { return { sortableAttributes: { id: 'elementId', class: 'class-name' } } } } </script>
React
import React from 'react'; import Sortable from 'devextreme-react/sortable'; class App extends React.Component { sortableAttributes = { id: 'elementId', class: 'class-name' } render() { return ( <Sortable ... elementAttr={this.sortableAttributes}> </Sortable> ); } } export default App;
group
Set this property to identical values for the UI components you want to collect into a single group. This allows users to drag and drop items between components, but only in the UI. To handle drag and drop in code, implement the onAdd and onRemove handlers. Both these handlers are executed simultaneously when an item is dropped to the target component, but onAdd is executed in the target component, while onRemove is executed in the source component.
height
This property accepts a value of one of the following types:
Number
The height in pixels.String
A CSS-accepted measurement of height. For example,"55px"
,"20vh"
,"80%"
,"inherit"
.Function (deprecated since v21.2)
Refer to the W0017 warning description for information on how you can migrate to viewport units.
moveItemOnDrop
jQuery
We recommend that you set moveItemsOnDrop to true because changes to the data model do not automatically update the HTML markup. If you set this property to false, you should move DOM nodes in the onReorder function.
Angular
We recommend that you set this property to false. In Angular, the HTML markup depends on the data model and is updated automatically when you make changes.
Vue
We recommend that you set this property to false. In Vue, the HTML markup depends on the data model and is updated automatically when you make changes.
React
We recommend that you set this property to false. In React, the HTML markup depends on the data model and is updated automatically when you make changes.
onAdd
Name | Type | Description |
---|---|---|
component |
The UI component that raised the event. |
|
dropInsideItem |
Indicates if the dragged item is dropped inside another item. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. |
fromData | any |
Custom data associated with the source UI component. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The dragged item's data. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
toComponent | | |
The instance of the item's target UI component. |
toData | any |
Custom data associated with the target UI component. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
onDisposing
A function that is executed before the UI component is disposed of.
Name | Type | Description |
---|---|---|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
component | Sortable |
The UI component's instance. |
onDragChange
Name | Type | Description |
---|---|---|
cancel |
Allows you to cancel the gesture. |
|
component | Sortable |
The UI component that raised the event. |
dropInsideItem |
Indicates if the dragged item is dropped inside another item. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. Works only for element drag and drop between components. |
fromData | any |
Custom data associated with the source UI component. Works only for element drag and drop between components. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The item's data before the drag operation. Note that you should specify the item data manually. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
toComponent | | |
The instance of the item's target UI component. Works only for element drag and drop between components. |
toData | any |
Custom data associated with the target UI component. Works only for element drag and drop between components. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
jQuery
$(function() { var treeView = $("#simple-treeview").dxTreeView({ items: treeViewItems, dataStructure: "plain", <!-- ... --> }).dxTreeView("instance"); $("#simple-treeview").dxSortable({ filter: ".dx-treeview-item", allowReordering: true, dragTemplate: dragTemplateFunc, onDragChange: function (e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } }); }); function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; }
<div class="demo-container"> <div class="form"> <div id="simple-treeview"></div> </div> </div>
Angular
import { DxSortableModule, DxTreeViewModule } from "devextreme-angular"; // ... export class AppComponent { onDragChange(e){ e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } @NgModule({ imports: [ // ... DxSortableModule, DxTreeViewModule ], // ... })
<dx-sortable filter=".dx-treeview-item" [allowReordering]="true" (onDragChange)="onDragChange($event)" dragTemplate="myDragTemplate" > <div *dxTemplate="let e of 'myDragTemplate'"> <div>{{ e.itemData + " drag template" }}</div> </div> <dx-tree-view id="simple-treeview" [items]="treeViewItems" dataStructure="plain" ...> </dx-tree-view> </dx-sortable>
Vue
<template> <DxSortable filter=".dx-treeview-item" :allow-reordering="true" @drag-change="onDragChange" :drag-template="myDragTemplate" > <template #myDragTemplate="{ data }"> <div>{{ data.itemData.Task_Subject}} + "drag template"</div> </template> <DxTreeView id="simple-treeview" data-structure="plain" :items="treeViewItems" /> </DxSortable> </template> <script> import DxTreeView from 'devextreme-vue/tree-view'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable, DxTreeView }, methods: { onDragChange(e) { e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } } </script>
React
import React from 'react'; import TreeView from 'devextreme-react/tree-view'; import Sortable from 'devextreme-react/sortable'; import { Template } from 'devextreme-react/core/template'; function myDragTemplate(e) { return ( e.itemData + " drag template"; ); } class App extends React.Component { constructor(props) { //... } render() { return ( <Sortable filter=".dx-treeview-item" allowReordering={true} onDragChange={this.onDragChange} dragTemplate={myDragTemplate}> <TreeView id="simple-treeview" dataStructure="plain" items={this.state.treeViewItems} /> </Sortable> ); } onDragChange = (e) => { e.itemData = this.state.treeViewItems[e.fromIndex].name; // your code } } export default App;
ASP.NET Core Controls
@(Html.DevExtreme().Sortable() .Filter(".dx-treeview-item") .AllowReordering(true) .OnDragChange("onDragChange") .DragTemplate(new JS("dragTemplateFunc")) .Content( Html.DevExtreme().TreeView() .ID("simple-treeview") .DataStructure(TreeViewDataStructure.Plain) .DataSource(d => d.Mvc().LoadAction("GetPlainDataForDragAndDrop")) .DataSourceOptions(o => o.Map("mapIcons")) ) ) <script> function onDragChange(e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; } </script>
onDragEnd
Name | Type | Description |
---|---|---|
cancel |
Allows you to cancel the gesture. |
|
component | Sortable |
The UI component that raised the event. |
dropInsideItem |
Indicates if the dragged item is dropped inside another item. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. Works only for element drag and drop between components. |
fromData | any |
Custom data associated with the source UI component. Works only for element drag and drop between components. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The item's data before the drag operation. Note that you should specify the item data manually. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
toComponent | | |
The instance of the item's target UI component. Works only for element drag and drop between components. |
toData | any |
Custom data associated with the target UI component. Works only for element drag and drop between components. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
jQuery
$(function() { var treeView = $("#simple-treeview").dxTreeView({ items: treeViewItems, dataStructure: "plain", <!-- ... --> }).dxTreeView("instance"); $("#simple-treeview").dxSortable({ filter: ".dx-treeview-item", allowReordering: true, dragTemplate: dragTemplateFunc, onDragEnd: function (e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } }); }); function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; }
<div class="demo-container"> <div class="form"> <div id="simple-treeview"></div> </div> </div>
Angular
import { DxSortableModule, DxTreeViewModule } from "devextreme-angular"; // ... export class AppComponent { onDragEnd(e){ e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } @NgModule({ imports: [ // ... DxSortableModule, DxTreeViewModule ], // ... })
<dx-sortable filter=".dx-treeview-item" [allowReordering]="true" (onDragEnd)="onDragEnd($event)" dragTemplate="myDragTemplate" > <div *dxTemplate="let e of 'myDragTemplate'"> <div>{{ e.itemData + " drag template" }}</div> </div> <dx-tree-view id="simple-treeview" [items]="treeViewItems" dataStructure="plain" ...> </dx-tree-view> </dx-sortable>
Vue
<template> <DxSortable filter=".dx-treeview-item" :allow-reordering="true" @drag-end="onDragEnd" :drag-template="myDragTemplate" > <template #myDragTemplate="{ data }"> <div>{{ data.itemData.Task_Subject}} + "drag template"</div> </template> <DxTreeView id="simple-treeview" data-structure="plain" :items="treeViewItems" /> </DxSortable> </template> <script> import DxTreeView from 'devextreme-vue/tree-view'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable, DxTreeView }, data() { return { myDragTemplate: "myDragTemplate", //... }; }, methods: { onDragEnd(e) { e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } } </script>
React
import React from 'react'; import TreeView from 'devextreme-react/tree-view'; import Sortable from 'devextreme-react/sortable'; import { Template } from 'devextreme-react/core/template'; function myDragTemplate(e) { return ( e.itemData + " drag template"; ); } class App extends React.Component { constructor(props) { //... } render() { return ( <Sortable filter=".dx-treeview-item" allowReordering={true} onDragEnd={this.onDragEnd} dragTemplate={myDragTemplate}> <TreeView id="simple-treeview" dataStructure="plain" items={this.state.treeViewItems} /> </Sortable> ); } onDragEnd = (e) => { e.itemData = this.state.treeViewItems[e.fromIndex].name; // your code } } export default App;
ASP.NET Core Controls
@(Html.DevExtreme().Sortable() .Filter(".dx-treeview-item") .AllowReordering(true) .OnDragEnd("onDragEnd") .DragTemplate(new JS("dragTemplateFunc")) .Content( Html.DevExtreme().TreeView() .ID("simple-treeview") .DataStructure(TreeViewDataStructure.Plain) .DataSource(d => d.Mvc().LoadAction("GetPlainDataForDragAndDrop")) .DataSourceOptions(o => o.Map("mapIcons")) ) ) <script> function onDragEnd(e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; } </script>
onDragMove
Name | Type | Description |
---|---|---|
cancel |
Allows you to cancel the gesture. |
|
component | Sortable |
The UI component that raised the event. |
dropInsideItem |
Indicates if the dragged item is dropped inside another item. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. Works only for element drag and drop between components. |
fromData | any |
Custom data associated with the source UI component. Works only for element drag and drop between components. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The item's data before the drag operation. Note that you should specify the item data manually. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
toComponent | | |
The instance of the item's target UI component. Works only for element drag and drop between components. |
toData | any |
Custom data associated with the target UI component. Works only for element drag and drop between components. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
jQuery
$(function() { var treeView = $("#simple-treeview").dxTreeView({ items: treeViewItems, dataStructure: "plain", <!-- ... --> }).dxTreeView("instance"); $("#simple-treeview").dxSortable({ filter: ".dx-treeview-item", allowReordering: true, dragTemplate: dragTemplateFunc, onDragMove: function (e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } }); }); function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; }
<div class="demo-container"> <div class="form"> <div id="simple-treeview"></div> </div> </div>
Angular
import { DxSortableModule, DxTreeViewModule } from "devextreme-angular"; // ... export class AppComponent { onDragMove(e){ e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } @NgModule({ imports: [ // ... DxSortableModule, DxTreeViewModule ], // ... })
<dx-sortable filter=".dx-treeview-item" [allowReordering]="true" (onDragMove)="onDragMove($event)" dragTemplate="myDragTemplate" > <div *dxTemplate="let e of 'myDragTemplate'"> <div>{{ e.itemData + " drag template" }}</div> </div> <dx-tree-view id="simple-treeview" [items]="treeViewItems" dataStructure="plain" ...> </dx-tree-view> </dx-sortable>
Vue
<template> <DxSortable filter=".dx-treeview-item" :allow-reordering="true" @drag-move="onDragMove" :drag-template="myDragTemplate" > <template #myDragTemplate="{ data }"> <div>{{ data.itemData.Task_Subject}} + "drag template"</div> </template> <DxTreeView id="simple-treeview" data-structure="plain" :items="treeViewItems" /> </DxSortable> </template> <script> import DxTreeView from 'devextreme-vue/tree-view'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable, DxTreeView }, data() { return { myDragTemplate: "myDragTemplate", //... }; }, methods: { onDragMove(e) { e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } } </script>
React
import React from 'react'; import TreeView from 'devextreme-react/tree-view'; import Sortable from 'devextreme-react/sortable'; import { Template } from 'devextreme-react/core/template'; function myDragTemplate(e) { return ( e.itemData + " drag template"; ); } class App extends React.Component { constructor(props) { //... } render() { return ( <Sortable filter=".dx-treeview-item" allowReordering={true} onDragMove={this.onDragMove} dragTemplate={myDragTemplate}> <TreeView id="simple-treeview" dataStructure="plain" items={this.state.treeViewItems} /> </Sortable> ); } onDragMove = (e) => { e.itemData = this.state.treeViewItems[e.fromIndex].name; // your code } } export default App;
ASP.NET Core Controls
@(Html.DevExtreme().Sortable() .Filter(".dx-treeview-item") .AllowReordering(true) .OnDragMove("onDragMove") .DragTemplate(new JS("dragTemplateFunc")) .Content( Html.DevExtreme().TreeView() .ID("simple-treeview") .DataStructure(TreeViewDataStructure.Plain) .DataSource(d => d.Mvc().LoadAction("GetPlainDataForDragAndDrop")) .DataSourceOptions(o => o.Map("mapIcons")) ) ) <script> function onDragMove(e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; } </script>
onDragStart
Name | Type | Description |
---|---|---|
cancel |
Allows you to cancel the gesture. |
|
component | Sortable |
The UI component that raised the event. |
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromData | any |
Custom data associated with the source UI component. Works only for element drag and drop between components. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The item's data before the drag operation. Note that you should specify the item data manually. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
jQuery
$(function() { var treeView = $("#simple-treeview").dxTreeView({ items: treeViewItems, dataStructure: "plain", <!-- ... --> }).dxTreeView("instance"); $("#simple-treeview").dxSortable({ filter: ".dx-treeview-item", allowReordering: true, dragTemplate: dragTemplateFunc, onDragStart: function (e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } }); }); function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; }
<div class="demo-container"> <div class="form"> <div id="simple-treeview"></div> </div> </div>
Angular
import { DxSortableModule, DxTreeViewModule } from "devextreme-angular"; // ... export class AppComponent { onDragStart(e){ e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } @NgModule({ imports: [ // ... DxSortableModule, DxTreeViewModule ], // ... })
<dx-sortable filter=".dx-treeview-item" [allowReordering]="true" (onDragStart)="onDragStart($event)" dragTemplate="myDragTemplate" > <div *dxTemplate="let e of 'myDragTemplate'"> <div>{{ e.itemData + " drag template" }}</div> </div> <dx-tree-view id="simple-treeview" [items]="treeViewItems" dataStructure="plain" ...> </dx-tree-view> </dx-sortable>
Vue
<template> <DxSortable filter=".dx-treeview-item" :allow-reordering="true" @drag-start="onDragStart" :drag-template="myDragTemplate" > <template #myDragTemplate="{ data }"> <div>{{ data.itemData.Task_Subject}} + "drag template"</div> </template> <DxTreeView id="simple-treeview" data-structure="plain" :items="treeViewItems" /> </DxSortable> </template> <script> import DxTreeView from 'devextreme-vue/tree-view'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable, DxTreeView }, data() { return { myDragTemplate: "myDragTemplate", //... }; }, methods: { onDragStart(e) { e.itemData = this.treeViewItems[e.fromIndex].name; // ... } } } </script>
React
import React from 'react'; import TreeView from 'devextreme-react/tree-view'; import Sortable from 'devextreme-react/sortable'; import { Template } from 'devextreme-react/core/template'; function myDragTemplate(e) { return ( e.itemData + " drag template"; ); } class App extends React.Component { constructor(props) { //... } render() { return ( <Sortable filter=".dx-treeview-item" allowReordering={true} onDragStart={this.onDragStart} dragTemplate={myDragTemplate}> <TreeView id="simple-treeview" dataStructure="plain" items={this.state.treeViewItems} /> </Sortable> ); } onDragStart = (e) => { e.itemData = this.state.treeViewItems[e.fromIndex].name; // your code } } export default App;
ASP.NET Core Controls
@(Html.DevExtreme().Sortable() .Filter(".dx-treeview-item") .AllowReordering(true) .OnDragStart("onDragStart") .DragTemplate(new JS("dragTemplateFunc")) .Content( Html.DevExtreme().TreeView() .ID("simple-treeview") .DataStructure(TreeViewDataStructure.Plain) .DataSource(d => d.Mvc().LoadAction("GetPlainDataForDragAndDrop")) .DataSourceOptions(o => o.Map("mapIcons")) ) ) <script> function onDragStart(e) { e.itemData = e.element.find(".dx-treeview-item")[e.fromIndex].innerText; // your code } function dragTemplateFunc(item, customContainer){ var $customContainer = $(document.createElement("div")) .text(item.itemData + ' drag template'); return $customContainer; } </script>
onInitialized
Name | Type | Description |
---|---|---|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
component | Sortable |
The UI component's instance. |
Angular
<dx-sortable ... (onInitialized)="saveInstance($event)"> </dx-sortable>
import { Component } from "@angular/core"; import Sortable from "devextreme/ui/data_grid"; // ... export class AppComponent { sortableInstance: Sortable; saveInstance (e) { this.sortableInstance = e.component; } }
Vue
<template> <div> <DxSortable ... @initialized="saveInstance"> </DxSortable> </div> </template> <script> import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable }, data: function() { return { sortableInstance: null }; }, methods: { saveInstance: function(e) { this.sortableInstance = e.component; } } }; </script>
<template> <div> <DxSortable ... @initialized="saveInstance"> </DxSortable> </div> </template> <script setup> import DxSortable from 'devextreme-vue/sortable'; let sortableInstance = null; const saveInstance = (e) => { sortableInstance = e.component; } </script>
React
import Sortable from 'devextreme-react/sortable'; class App extends React.Component { constructor(props) { super(props); this.saveInstance = this.saveInstance.bind(this); } saveInstance(e) { this.sortableInstance = e.component; } render() { return ( <div> <Sortable onInitialized={this.saveInstance} /> </div> ); } }
See Also
onOptionChanged
Name | Type | Description |
---|---|---|
value | any |
The modified property's new value. |
previousValue | any |
The UI component's previous value. |
name |
The modified property if it belongs to the first level. Otherwise, the first-level property it is nested into. |
|
fullName |
The path to the modified property that includes all parent properties. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
component | Sortable |
The UI component's instance. |
The following example shows how to subscribe to component property changes:
jQuery
$(function() { $("#sortableContainer").dxSortable({ // ... onOptionChanged: function(e) { if(e.name === "changedProperty") { // handle the property change here } } }); });
Angular
<dx-sortable ... (onOptionChanged)="handlePropertyChange($event)"> </dx-sortable>
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { // ... handlePropertyChange(e) { if(e.name === "changedProperty") { // handle the property change here } } }
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { DxSortableModule } from 'devextreme-angular'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, DxSortableModule ], providers: [ ], bootstrap: [AppComponent] }) export class AppModule { }
Vue
<template> <DxSortable ... @option-changed="handlePropertyChange" /> </template> <script> import 'devextreme/dist/css/dx.light.css'; import DxSortable from 'devextreme-vue/sortable'; export default { components: { DxSortable }, // ... methods: { handlePropertyChange: function(e) { if(e.name === "changedProperty") { // handle the property change here } } } } </script>
React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import Sortable from 'devextreme-react/sortable'; const handlePropertyChange = (e) => { if(e.name === "changedProperty") { // handle the property change here } } export default function App() { return ( <Sortable ... onOptionChanged={handlePropertyChange} /> ); }
onRemove
Name | Type | Description |
---|---|---|
component | Sortable |
The UI component that raised the event. |
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. |
fromData | any |
Custom data associated with the source UI component. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The dragged item's data. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
toComponent | | |
The instance of the item's target UI component. |
toData | any |
Custom data associated with the target UI component. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
onReorder
Name | Type | Description |
---|---|---|
component | Sortable |
The UI component that raised the event. |
dropInsideItem |
Indicates if the dragged item is dropped inside another item. |
|
element |
The UI component's container. It is an HTML Element or a jQuery Element when you use jQuery. |
|
event | Event (jQuery or EventObject) |
The event that caused the function to execute. It is an EventObject or a jQuery.Event when you use jQuery. |
fromComponent | | |
The instance of the item's source UI component. |
fromData | any |
Custom data associated with the source UI component. |
fromIndex |
The item's original position. If the item is dragged from another UI component, the value is -1. |
|
itemData | any |
The dragged item's data. |
itemElement |
The container of the item being dragged. It is an HTML Element or a jQuery Element when you use jQuery. |
|
promise |
Assign a Promise to this field to perform an asynchronous operation. |
|
toComponent | | |
The instance of the item's target UI component. |
toData | any |
Custom data associated with the target UI component. |
toIndex |
The position in which the item is placed. If the item is dragged away from the UI component, the value is -1. |
rtlEnabled
When this property is set to true, the UI component text flows from right to left, and the layout of elements is reversed. To switch the entire application/site to the right-to-left representation, assign true to the rtlEnabled field of the object passed to the DevExpress.config(config) method.
DevExpress.config({ rtlEnabled: true });
scrollSensitivity
Specifies the distance in pixels from the edge of viewport at which scrolling should start. Applies only if autoScroll is true.
scrollSpeed
Specifies the scrolling speed when dragging an item beyond the viewport. Applies only if autoScroll is true.
width
This property accepts a value of one of the following types:
Number
The width in pixels.String
A CSS-accepted measurement of width. For example,"55px"
,"20vw"
,"80%"
,"auto"
,"inherit"
.Function (deprecated since v21.2)
Refer to the W0017 warning description for information on how you can migrate to viewport units.
If you have technical questions, please create a support ticket in the DevExpress Support Center.