2013-01-12 9 views
0

나는 노드가 많은 데이터베이스에서 채워진 TreeView을 가지고 있으며 각 노드에는 자식이있을 수 있으며 2 depthes와 같은 고정 된 역할이 없으므로 매우 깊을 수 있습니다.TreeView에서 한 번에 하나의 체크 된 노드

TreeViewCheckBoxesRadioButtons이라고 가정하면, TreeView은 한 번에 하나의 체크 노드 만 갖기를 원합니다. AfterCheckBeforeCheck 이벤트를 시도했지만 영원히 루프에 빠지면 어떻게해야합니까?

체크 된 노드를 계속 체크하고 모든 다른 노드를 선택 취소 할 수는 있지만 그럴 수는 없습니다. 당신의 스마트 포인트를 기다리고 있습니다. 감사. 여기

내가 시도 코드입니다하지만 StackOverFlow 제외하고 결국, 나는 그것을 가서 StackOverflow에 그것을 확인 말하는 어쩌면 생각 : D 여기

private void tvDepartments_AfterCheck(object sender, TreeViewEventArgs) 
{ 
    List<TreeNode> nodes = new List<TreeNode>(); 
    if (rdSubDepartments.Checked) 
     CheckSubNodes(e.Node, e.Node.Checked); 
    else if (rdSingleDepartment.Checked) 
    { 
     foreach (TreeNode node in tvDepartments.Nodes) 
     { 
      if (node != e.Node) 
       node.Checked = false; 
     } 
    } 
} 


public void CheckSubNodes(TreeNode root, bool checkState) 
{ 
    foreach (TreeNode node in root.Nodes) 
    { 
     node.Checked = checkState; 
     if (node.Nodes.Count > 0) 
      CheckSubNodes(node, checkState); 
    } 
} 
+2

당신이 손에 귀하의 질문에 관련된 어떤 코드를 현재 가지고 게시 할 경우 마흐디 그것이 더 나은 서비스를 제공 할 .. – MethodMan

+0

난 당신이 올바른 방향으로 묶어 생각합니다. 코드를 게시하십시오. – Rafal

+0

'private void node_AfterCheck (object sender, TreeViewEventArgs e)'를 표시해주세요.이 이벤트는 방금 강조한 이벤트가 2 개 필요하고,'private void CheckAllChildNodes (TreeNode treeNode, bool nodeChecked)와 같은 메소드 Signature가있는 이벤트입니다. '또한 if 부모 노드에 ChildNodes가 있습니다. 코드를 게시 할 때까지 기다리는 foreach {} 루프를 수행해야합니다. 확인했습니다. – MethodMan

답변

3

마흐디는이 TreeView.AfterCheck Event에서 참조 같아야 것입니다

// Updates all child tree nodes recursively. 
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 
{ 
    foreach(TreeNode node in treeNode.Nodes) 
    { 
     node.Checked = nodeChecked; 
     if(node.Nodes.Count > 0) 
     { 
     // If the current node has child nodes, call the CheckAllChildsNodes method recursively. 
     this.CheckAllChildNodes(node, nodeChecked); 
     } 
    } 
} 

// NOTE This code can be added to the BeforeCheck event handler instead of the AfterCheck event. 
// After a tree node's Checked property is changed, all its child nodes are updated to the same value. 
private void node_AfterCheck(object sender, TreeViewEventArgs e) 
{ 
    // The code only executes if the user caused the checked state to change. 
    if(e.Action != TreeViewAction.Unknown) 
    { 
     if(e.Node.Nodes.Count > 0) 
     { 
     /* Calls the CheckAllChildNodes method, passing in the current 
     Checked value of the TreeNode whose checked state changed. */ 
     this.CheckAllChildNodes(e.Node, e.Node.Checked); 
     } 
    } 
} 
+0

+1. DJ KRAZE에게 감사합니다. 필요한 모든 것은'e.Action! = TreeViewAction.Unknown'이었습니다. 조금 더 변경하면 효과가있었습니다. 행운을 빌어 요. –

+0

Mahdi 내가 올바른 참조를 알려줄 수 있었기 때문에 기쁩니다. 행운을 빌어 요. – MethodMan