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 많은 도움이 될 것입니다이 해결을! 정말 고맙습니다!
그 트릭을 수행했습니다! –
우수 ... 자식 노드 다음에 부모 노드를 처리하는 것을 생각하지 않았습니다. 이것은 충분히 효율적으로 보이기 때문에 지금은 SELECTR 쿼리를 작성할 필요가 없습니다. 다시 한 번 감사드립니다! –
@EricNewman 축하합니다! 귀하의 질문에 이미 답변 한 것으로 생각되면 대답을 수락 할 수 있습니다. [faq] (http://stackoverflow.com/faq#howtoask) –