2011-02-06 6 views
0

このコードは、ツリービューコントロールの子ノードをチェックしたり、チェックを外したりします。 このコードではどのアルゴリズムが使用されていますか?このコードではどのようなアルゴリズムが使用されていますか?

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は、イベントハンドラが束縛されずに再帰するときの非常に典型的な結果です。 finallyブロックは、(例えばThreadExceptionDialog経由など)に処理の例外が恒久的に真の状態変数セットを残さないことが保証さ

private bool modifyingNodes; 

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

一般的なパターンは、これに似ています。もちろんオプションです。

関連する問題