/// <summary> /// 엔티티를 로드하고, IRadTreeNodeContainer에 자식노드로 추가한다. /// </summary> /// <param name="node">선택된 IRadTreeNodeContainer</param> /// <param name="exceptionAction">예외발생 시 수행할 Action</param> protected virtual void LoadAndAddEntity(IRadTreeNodeContainer node, Action <Exception> exceptionAction) { if (IsDebugEnabled) { log.Debug(@"==>S 엔티티[{0}] 목록을 로드하여, TreeView에 바인딩 시킵니다...", ConcreteType.Name); } node.ShouldNotBeNull("선택된 IRadTreeNodeContainer정보가 없습니다."); try { LoadEntity(node); AddEntity(node); } catch (Exception ex) { var errorMsg = string.Format(@"엔티티[{0}]를 로드하고, Binding 시에 예외가 발생했습니다.", ConcreteType.Name); if (log.IsErrorEnabled) { log.ErrorException(errorMsg, ex); } if (exceptionAction != null) { exceptionAction(ex); } else { WebAppTool.MessageBox(errorMsg, this); } } }
/// <summary> /// 특정 NodeContainer의 자손 중 자식 노드가 없는 TreeNode들 (나무 잎) 을 열거합니다. /// </summary> /// <param name="nodeContainer"></param> /// <returns></returns> public static IEnumerable <RadTreeNode> FindLeafNodes(this IRadTreeNodeContainer nodeContainer) { nodeContainer.ShouldNotBeNull("nodeContainer"); if (IsDebugEnabled) { log.Debug(@"특정 NodeContainer 하위의 모든 Leaf Node (자식이 없는 노드) 들을 Depth First 방식으로 찾습니다. nodeContainer=[{0}]", nodeContainer.AsTextAndValue()); } return(nodeContainer.GetDescendentNodes().Where(n => n.Nodes.Count == 0)); }
/// <summary> /// Depth-First 탐색으로 특정 Node 와 그 자손 Node 들 중에 검사를 통과하는 Node들을 열거합니다. /// </summary> /// <param name="nodeContainer"></param> /// <param name="predicate"></param> /// <returns></returns> public static IEnumerable <RadTreeNode> FindNodes(this IRadTreeNodeContainer nodeContainer, Func <RadTreeNode, bool> predicate) { nodeContainer.ShouldNotBeNull("nodeContainer"); predicate.ShouldNotBeNull("predicate"); if (IsDebugEnabled) { log.Debug("특정 NodeContainer(TreeView or TreeNode)부터 predicate를 만족하는 RadTreeNode 들을 모두 열거합니다. nodeContainer=[{0}]", nodeContainer.AsTextAndValue()); } return(nodeContainer.GetDescendentNodes().Where(predicate)); }
/// <summary> /// 특정 TreeNode의 자식으로 노드를 추가합니다. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parent"></param> /// <param name="nodeFactory">노드 생성 메소드</param> /// <param name="nodeAddedAction">노드 추가마다 호출되는 메소드</param> /// <param name="items"></param> public static void AddNodes <T>(this IRadTreeNodeContainer parent, Func <T, RadTreeNode> nodeFactory, Action <T, RadTreeNode> nodeAddedAction, IEnumerable <T> items) { if (items.IsEmptySequence()) { return; } parent.ShouldNotBeNull("parent"); nodeFactory.ShouldNotBeNull("nodeFactory"); if (IsDebugEnabled) { log.Debug(@"TreeNode의 자식 노드들을 추가합니다..."); } foreach (T item in items) { if (IsDebugEnabled) { log.Debug(@"엔티티를 RadTreeNode로 빌드합니다. item=[{0}]", item); } var childNode = nodeFactory(item); if (childNode != null) { parent.Nodes.Add(childNode); if (IsDebugEnabled) { log.Debug(@"TreeNode에 자식 노드를 추가했습니다. parent=[{0}], childNode=[{1}]", parent, childNode.Text); } if (nodeAddedAction != null) { nodeAddedAction(item, childNode); } } } }
/// <summary> /// <see cref="ITreeNodeEntity{T}"/>를 구현한 엔티티들을 표현할 TreeNode를 생성하여 TreeView에 추가합니다. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parent">부모 노드 또는 TreeView</param> /// <param name="nodeFactory">TreeNode를 생성하는 Factory 함수</param> /// <param name="findNodeFunc">기존 TreeView에서 엔티티와 관련된 Node를 찾는 함수</param> /// <param name="nodeAddedAction">TreeNode 하나를 추가할 때마다 수행하는 Action</param> /// <param name="items">엔티티</param> /// <param name="includeChildren">엔티티의 자손들도 Binding 할 것인가?</param> public static void BuildTreeNodes <T>(this IRadTreeNodeContainer parent, Func <T, RadTreeNode> nodeFactory, Func <T, RadTreeNode> findNodeFunc, Action <T, RadTreeNode> nodeAddedAction, IEnumerable <T> items, bool includeChildren) where T : class, ITreeNodeEntity <T> { if (items.IsEmptySequence()) { return; } parent.ShouldNotBeNull("parent"); nodeFactory.ShouldNotBeNull("nodeFactory"); findNodeFunc.ShouldNotBeNull("findNodeFunc"); RadTreeNode parentNode = null; foreach (T item in items) { // 이미 관련 노드가 있다면 추가하지 않습니다. if (findNodeFunc(item) != null) { continue; } if (IsDebugEnabled) { log.Debug(@"엔티티를 TreeNode로 빌드하여, TreeView에 추가합니다... item=[{0}]", item); } var childNode = nodeFactory(item); if (item.Parent != null) { parentNode = findNodeFunc(item.Parent); } if (parentNode != null) { // 부모 노드가 이미 TreeView에 추가되어 있다면, 부모 노드에 자식으로 추가합니다. parentNode.Nodes.Add(childNode); } else { // 부모 노드가 없다면, parent에 추가한다. parent.Nodes.Add(childNode); } if (IsDebugEnabled) { log.Debug(@"엔티티를 TreeNode로 빌드하여, TreeView에 추가했습니다!!!. childNode=[{0}]", childNode); } if (nodeAddedAction != null) { nodeAddedAction(item, childNode); } // 자식 노드들이 있고, 추가해야 한다면 DepthFirst 방식으로 추가합니다. // if (includeChildren && item.GetChildCount() > 0) { BuildTreeNodes(parentNode ?? parent, nodeFactory, findNodeFunc, nodeAddedAction, item.Children, true); } } }