2011-02-06 4 views
0

이 코드는 treeview 컨트롤의 자식 노드를 확인하고 선택을 취소합니다. 이 코드에는 어떤 알고리즘이 사용됩니까?이 코드에는 어떤 알고리즘이 사용됩니까?

private int _callCountUp; 

private int _callCountDn; 

private void tvwPermissions_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e) 
     { 
      bool anyChecked = false; 

      if (_callCountDn == 0 && e.Node.Parent != null) 
      { 
       anyChecked = false; 
       foreach (TreeNode childNode in e.Node.Parent.Nodes) 
       { 
        if (childNode.Checked) 
        { 
         anyChecked = true; 
         break; 
        } 
       } 
       _callCountUp += 1; 

       if (anyChecked) 
        e.Node.Parent.Checked = true; 

       _callCountUp -= 1; 
      } 

      if (_callCountUp == 0) 
      { 
       foreach (TreeNode childNode in e.Node.Nodes) 
       { 
        _callCountDn += 1; 
        childNode.Checked = e.Node.Checked; 
        _callCountDn -= 1; 
       } 
      } 
     } 
+2

저는이 질문을 정말로 이해하지 못합니다. 알고리즘이 사용 된 것이 아닌가? :) 또는 어떻게 작동하는지 궁금합니까? – Skurmedel

+0

또 다른 질문 :'tvwPermissions_AfterCheck'가 호출 될 때, 노드에서'Checked = ...'를 호출 할 때마다 의심 스럽습니다. – Skurmedel

답변

1

이 이름이 확실하지 않습니다. 노드의 Checked 속성을 변경하면 AfterCheck 이벤트 처리기가 다시 실행될 때 _callCountUp/Dn 필드가 문제를 방지합니다. StackOverflow는 이벤트 처리기가 묶이지 않고 되풀이되는 매우 일반적인 결과입니다.

일반적인 패턴이 유사합니다

private bool modifyingNodes; 

private void treeview_AfterCheck(object sender, TreeViewEventArgs e) { 
    if (modifyingNodes) return; 
    modifyingNodes = true; 
    try { 
     // etc.. 
    } 
    finally { 
     modifyingNodes = false; 
    } 
} 

finally 블록이 처리 된 예외 (예 : ThreadExceptionDialog을 통해)을 영구적으로 true로 상태 변수 세트를 두지 않도록합니다. 물론 선택 사항입니다.

관련 문제