/// <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 }
/// <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 }
/// <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); } } }
/// <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(); }
/// <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(); }
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()); }