Пример #1
0
        /// <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();
        }