public void MoveLeft() { var parentNode = (AchievementCategoryTreeNode)tvwAchievementCategories.SelectedNode.Parent; if (parentNode?.AchievementCategory is null) { return; } var selectedCategory = GetSelectedAchievementCategory(); dataManager.UpdateParent(selectedCategory, selectedCategory.Parent.Parent, selectedCategory.Parent.Location + 1); var node = parentNode.Parent; TreeNodeCollection nodes = null; if (node != null && node.Nodes != null) { nodes = node.Nodes; } else { nodes = tvwAchievementCategories.Nodes; } nodes.Insert(parentNode.Index + 1, new AchievementCategoryTreeNode(selectedCategory)); // Need to add this to ensure correct location numbers var categories = nodes.Cast <AchievementCategoryTreeNode>().Select(x => x.AchievementCategory).ToList(); dataManager.UpdateLocations(selectedCategory, categories); var nextNode = (AchievementCategoryTreeNode)tvwAchievementCategories.SelectedNode.NextNode; if (nextNode is not null) { tvwAchievementCategories.SelectedNode.Remove(); var prevNode = (AchievementCategoryTreeNode)nextNode.PrevNode; if (prevNode?.AchievementCategory is not null) { var categories2 = prevNode.Parent.Nodes.Cast <AchievementCategoryTreeNode>().Select(x => x.AchievementCategory).ToList(); dataManager.UpdateLocations(prevNode.AchievementCategory, categories2); } else // removed item was 1st element so we use next element and adjust from a fictional 1st element { var categories2 = nextNode.Parent.Nodes.Cast <AchievementCategoryTreeNode>().Select(x => x.AchievementCategory).ToList(); dataManager.UpdateLocations(new AchievementCategory(), categories2); } } RefreshTreeView(); }