2012-12-13 3 views
1

C# Treeview에서 목록의 값을 포함하지 않는 모든 분기를 제거해야합니다. 예를 들어, 목록이 {112, 74}이고 트리가 있습니다. 데이터 소스는 자체 조인 된 테이블입니다. 그래서 나는 쉽게 원하지 않는 잎과 가지를 제거 할 수 없다.원하지 않는 TreeView 지점을 모두 제거하는 방법

루트 BRANCH1 잎 112 잎 1 브랜치 리프 74 브랜치 리프 44 브랜치 리프 99

I가 발생해야한다

: 루트 BRANCH1 잎 112 브랜치 리프 74

다음은 코드입니다. 일종의 작품. 그러나 TrimTree는 하단 수준 만 제거합니다. 그래서 모든 빈 가지를 완전히 제거하려면이 함수를 몇 번 실행해야합니다. 매우 비효율적이다.

void GetTree(ref TreeView tv) 
    { 
    DataTable dt = c.GetTable("select id, parent_id, name from tbl_self_join_tree"); 
     tv.DataSource = new HierarchicalDataSet(dt, "ID", "Parent_ID"); 
     tv.DataBind(); 
    } 

    void TrimTree(TreeNodeCollection nodes, List<string> l) 
    { 
     TreeNode node = null; 
     for (int ndx = nodes.Count; ndx > 0; ndx--) 
     { 
      node = nodes[ndx - 1]; 
      if (node.ChildNodes.Count == 0 && !l.Contains(node.Value)) 
       nodes.Remove(node); 
      else 
       TrimTree(node.ChildNodes, l); 
     } 
    } 

내가 더 나은 SELECT 쿼리를 작성할 수 있다면, 나는 TrimTree() 함수 필요가 없습니다 : D 많은 도움이 될 것입니다이 해결을! 정말 고맙습니다!

답변

2

자식 노드를 처리 한 후에 부모 노드를 처리 할 수있는 것 같습니다. 이렇게하면 모든 리프가 삭제 된 상태로 나뭇 가지를 처리 ​​할 수 ​​있습니다.

//DISCLAIMER: I didn't compile or test this method. 
void TrimTree(TreeNodeCollection nodes, List<string> l) 
{ 
    TreeNode node = null; 
    for (int ndx = nodes.Count; ndx > 0; ndx--) 
    { 
     node = nodes[ndx - 1]; 
     TrimTree(node.ChildNodes, l); 
     if (node.ChildNodes.Count == 0 && !l.Contains(node.Value)) 
      nodes.Remove(node); 
    } 
} 
+0

그 트릭을 수행했습니다! –

+0

우수 ... 자식 노드 다음에 부모 노드를 처리하는 것을 생각하지 않았습니다. 이것은 충분히 효율적으로 보이기 때문에 지금은 SELECTR 쿼리를 작성할 필요가 없습니다. 다시 한 번 감사드립니다! –

+0

@EricNewman 축하합니다! 귀하의 질문에 이미 답변 한 것으로 생각되면 대답을 수락 할 수 있습니다. [faq] (http://stackoverflow.com/faq#howtoask) –

관련 문제