Example #1
0
        /// <summary>
        /// Sets the value.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <param name="propName">Name of the prop.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public virtual bool SetValue(object record, string propName, object value)
        {
            if (!(View is TreeGridSelfRelationalView))
            {
                return(TreeGridHelper.SetValue(record, propName, value));
            }

            var itemproperties = View.GetItemProperties();

            if (itemproperties == null)
            {
                return(false);
            }

            if (itemaccessor.ContainsKey(propName))
            {
                itemaccessor[propName].SetValue(record, value);
                return(true);
            }

            var tempitempproperties = itemproperties;
            var propertyNameList    = propName.Split('.');

#if WPF
            return(PropertyDescriptorExtensions.SetComplexPropertyValue(propertyNameList, tempitempproperties, record, value));
#else
            return(PropertyInfoExtensions.SetComplexPropertyValue(propertyNameList, tempitempproperties, record, value));
#endif
        }
Example #2
0
        /// <summary>
        /// Gets the value.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <param name="property">Name of the prop.</param>
        /// <returns></returns>
        ///
        public virtual object GetValue(object record, string property)
        {
            if (!(View is TreeGridSelfRelationalView))
            {
                return(TreeGridHelper.GetValue(record, property));
            }
            var itemproperties = View.GetItemProperties();

            if (itemproperties == null || record == null)
            {
                return(null);
            }

            if (itemaccessor.ContainsKey(property))
            {
                return(itemaccessor[property].GetValue(record));
            }

            var tempitempproperties = itemproperties;
            var propertyNameList    = property.Split('.');

#if WPF
            return(PropertyDescriptorExtensions.GetComplexPropertyValue(propertyNameList, tempitempproperties, record));
#else
            return(PropertyInfoExtensions.GetComplexPropertyValue(propertyNameList, tempitempproperties, record));
#endif
        }
Example #3
0
        /// <summary>
        /// Remove dragged nodes from tree grid while dropping.
        /// </summary>
        /// <param name="sourceTreeGrid">the grid from which drag operation in initiated.</param>
        /// <param name="nodes">dragged nodes.</param>
        protected virtual void ProcessDragSourceOnDrop(SfTreeGrid sourceTreeGrid, ObservableCollection <TreeNode> nodes)
        {
            var isSameGrid = (TreeGrid == sourceTreeGrid);

            if (sourceTreeGrid.View is TreeGridNestedView)
            {
                foreach (var node in nodes)
                {
                    if (node.ParentNode == null)
                    {
                        sourceTreeGrid.View.Remove(node.Item);
                    }
                    else
                    {
                        var collection     = sourceTreeGrid.View.propertyAccessProvider.GetValue(node.ParentNode.Item, sourceTreeGrid.ChildPropertyName) as IEnumerable;
                        var itemCollection = TreeGridHelper.GetSourceListCollection(collection);
                        if (itemCollection != null)
                        {
                            itemCollection.Remove(node.Item);
                        }
                    }
                    if (isSameGrid)
                    {
                        sourceTreeGrid.View.RemoveNode(node);
                    }
                }
            }
            else if (sourceTreeGrid.View is TreeGridSelfRelationalView)
            {
                foreach (var node in nodes)
                {
                    sourceTreeGrid.View.Remove(node.Item);
                    if (isSameGrid)
                    {
                        sourceTreeGrid.View.RemoveNode(node);
                    }
                }
            }
            else if (sourceTreeGrid.View is TreeGridUnboundView)
            {
                foreach (var node in nodes)
                {
                    sourceTreeGrid.View.RemoveNode(node);
                }
            }
        }
Example #4
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();
        }
Example #5
0
        /// <summary>
        /// Process drop operations in nested 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 ProcessDropOnNestedView(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;

            TreeGrid.View.Suspend();
            TreeGrid.SelectionController.SuspendUpdates();
            ProcessDragSourceOnDrop(sourceTreeGrid, nodes);
            var      itemIndex  = -1;
            var      nodeIndex  = -1;
            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;
            }
            IList sourceCollection = null;

            if (dropPosition == DropPosition.DropBelow || dropPosition == DropPosition.DropAbove)
            {
                if (treeNode.ParentNode != null)
                {
                    var collection = TreeGrid.View.propertyAccessProvider.GetValue(treeNode.ParentNode.Item, TreeGrid.ChildPropertyName) as IEnumerable;
                    sourceCollection = TreeGridHelper.GetSourceListCollection(collection);
                }
                else
                {
                    sourceCollection = TreeGridHelper.GetSourceListCollection(TreeGrid.View.SourceCollection);
                }
                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;
                }
            }
            else if (dropPosition == DropPosition.DropAsChild)
            {
                var item       = treeNode.Item;
                var collection = TreeGrid.View.propertyAccessProvider.GetValue(item, TreeGrid.ChildPropertyName) as IEnumerable;
                sourceCollection = TreeGridHelper.GetSourceListCollection(collection);
                if (sourceCollection == null)
                {
                    // Create sourcecollection by getting item type.
                    if (!DynamicHelper.CheckIsDynamicObject(item.GetType()))
                    {
                        var list = item.GetType().GetProperty(TreeGrid.ChildPropertyName).PropertyType.CreateNew() as IList;
                        if (list != null)
                        {
                            TreeGrid.View.propertyAccessProvider.SetValue(treeNode.Item, TreeGrid.ChildPropertyName, list);
                            sourceCollection = list;
                        }
                    }
                    else
                    {
                        // If item is dynamic collection, customer needs to override and add record.
                        this.TreeGrid.View.Resume();
                        TreeGrid.SelectionController.ResumeUpdates();
                        (TreeGrid.SelectionController as TreeGridRowSelectionController).RefreshSelection();
                        return;
                    }
                }
                itemIndex = sourceCollection.Count;
                nodeIndex = parentNode.ChildNodes.Count;
            }

            foreach (var node in nodes)
            {
                sourceCollection.Insert(itemIndex, node.Item);
                this.TreeGrid.View.AddNode(parentNode, node, nodeIndex, itemIndex, false);
            }

            UpdateParentNodeExpanderCell(parentNode);
            this.TreeGrid.View.Resume();
            TreeGrid.SelectionController.ResumeUpdates();
            (TreeGrid.SelectionController as TreeGridRowSelectionController).RefreshSelection();
        }
Example #6
0
        private List <TreeNode> SortNodes(SortColumnDescriptions sortColumnDescriptions, SortComparers sortComparers)
        {
            var list = nodeList;
            IOrderedEnumerable <TreeNode> source = null;

            for (int i = 0; i < sortColumnDescriptions.Count; i++)
            {
                var sortDescription = sortColumnDescriptions[i];
                var customComparer  = sortComparers[sortDescription.ColumnName];
                if (sortDescription.SortDirection == ListSortDirection.Ascending)
                {
                    if (i == 0)
                    {
                        if (customComparer == null)
                        {
                            source = list.OrderBy(node => TreeGridHelper.GetValue(node.Item, sortDescription.ColumnName));
                        }
                        else
                        {
                            source = list.OrderBy(node => node.Item, customComparer);
                        }
                    }
                    else
                    {
                        if (customComparer == null)
                        {
                            source = source.ThenBy(node => TreeGridHelper.GetValue(node.Item, sortDescription.ColumnName));
                        }
                        else
                        {
                            source = source.ThenBy(node => node.Item, customComparer);
                        }
                    }
                }
                else
                {
                    if (i == 0)
                    {
                        if (customComparer == null)
                        {
                            source = list.OrderByDescending(node => TreeGridHelper.GetValue(node.Item, sortDescription.ColumnName));
                        }
                        else
                        {
                            source = list.OrderByDescending(node => node.Item, customComparer);
                        }
                    }
                    else
                    {
                        if (customComparer == null)
                        {
                            source = source.ThenByDescending(node => TreeGridHelper.GetValue(node.Item, sortDescription.ColumnName));
                        }
                        else
                        {
                            source = source.ThenByDescending(node => node.Item, customComparer);
                        }
                    }
                }
            }
            return(source.ToList());
        }