/// <summary> /// Process drop operations in self relational view. /// </summary> /// <param name="rowColumnIndex">dropped row column index.</param> /// <param name="dropPosition">drop position.</param> /// <param name="nodes">the dragging nodes which needs to be dropped.</param> /// <param name="sourceTreeGrid">the grid from which drag operation in initiated.</param> protected virtual void ProcessDropOnSelfRelationalView(RowColumnIndex rowColumnIndex, DropPosition dropPosition, ObservableCollection <TreeNode> nodes, SfTreeGrid sourceTreeGrid) { var isSameGrid = (TreeGrid == sourceTreeGrid); var treeNode = this.TreeGrid.GetNodeAtRowIndex(rowColumnIndex.RowIndex); if (treeNode == null) { return; } var data = treeNode.Item; object parentPropertyValue = null; TreeGrid.View.Suspend(); TreeGrid.SelectionController.SuspendUpdates(); ProcessDragSourceOnDrop(sourceTreeGrid, nodes); TreeNode parentNode = null; if (dropPosition == DropPosition.DropBelow || dropPosition == DropPosition.DropAbove) { parentNode = treeNode.ParentNode; } else if (dropPosition == DropPosition.DropAsChild) { if (!treeNode.IsExpanded) { TreeGrid.ExpandNode(treeNode); } parentNode = treeNode; } var itemIndex = -1; var nodeIndex = -1; IList sourceCollection = TreeGridHelper.GetSourceListCollection(TreeGrid.View.SourceCollection); if (dropPosition == DropPosition.DropAsChild) { itemIndex = sourceCollection.Count; nodeIndex = parentNode.ChildNodes.Count; } else if (dropPosition == DropPosition.DropBelow || dropPosition == DropPosition.DropAbove) { itemIndex = sourceCollection.IndexOf(data); if (parentNode != null) { nodeIndex = parentNode.ChildNodes.IndexOf(treeNode); } else { nodeIndex = this.TreeGrid.View.Nodes.RootNodes.IndexOf(treeNode); } if (dropPosition == DropPosition.DropBelow) { itemIndex += 1; nodeIndex += 1; } } var propertyAccessProvider = TreeGrid.View.GetPropertyAccessProvider(); if (parentNode != null) { parentPropertyValue = propertyAccessProvider.GetValue(parentNode.Item, TreeGrid.ParentPropertyName); } else { if (TreeGrid.ReadLocalValue(SfTreeGrid.SelfRelationRootValueProperty) != DependencyProperty.UnsetValue) { parentPropertyValue = TreeGrid.SelfRelationRootValue; } } foreach (var node in nodes) { if (parentNode == null && TreeGrid.ReadLocalValue(SfTreeGrid.SelfRelationRootValueProperty) == DependencyProperty.UnsetValue) { if (isSameGrid) { parentPropertyValue = GetChildPropertyValue(node); } else { parentPropertyValue = GetChildPropertyValue(treeNode); } } SetValue(node.Item, TreeGrid.ChildPropertyName, propertyAccessProvider, parentPropertyValue); sourceCollection.Insert(itemIndex, node.Item); if (isSameGrid) { this.TreeGrid.View.AddNode(parentNode, node, nodeIndex, needDataShaping: false); } else { (this.TreeGrid.View as TreeGridSelfRelationalView).CheckPrimaryKey(); this.TreeGrid.View.AddNode(parentNode, node.Item, nodeIndex, false); } } UpdateParentNodeExpanderCell(parentNode); this.TreeGrid.View.Resume(); TreeGrid.SelectionController.ResumeUpdates(); (TreeGrid.SelectionController as TreeGridRowSelectionController).RefreshSelection(); }