public static void SetParentLinkForChildren <T>(this IGuidTreeItemGeneric <T> guidTreeItem) where T : class, IGuidTreeItemGeneric <T> { if (guidTreeItem.Children == null) { return; } foreach (var child in guidTreeItem.Children) { child.Parent = guidTreeItem; child.UpdateAncestry(); //Recurse child.SetParentLinkForChildren(); } }
public static string GetAncestry <T>(this IGuidTreeItemGeneric <T> guidTreeItem, bool usePopulatedParentIfPossible = false) { if (usePopulatedParentIfPossible && guidTreeItem.Parent != null && guidTreeItem.Parent.Ancestry != null) { return(guidTreeItem.Parent.Ancestry + guidTreeItem.Id); } var ancestry = new List <IGuidTreeItemGeneric <T> >(); var currentStage = guidTreeItem; while (currentStage != null) { if (ancestry.Contains(currentStage)) { throw new StackOverflowException("The current tree structure contains a loop"); } ancestry.Add(currentStage); currentStage = currentStage.Parent; } return(BuildAcestryString(ancestry)); }
public static void UpdateAncestry <T>(this IGuidTreeItemGeneric <T> guidTreeItem, bool usePopulatedParentIfPossible = false) { guidTreeItem.Ancestry = guidTreeItem.GetAncestry(usePopulatedParentIfPossible); }
public static int GetTreeLevel <T>(this IGuidTreeItemGeneric <T> guidTreeItem) { return(guidTreeItem.Ancestry.Length / Guid.Empty.ToString().Length); }