在这段代码中使用了什么算法?

时间:2011-02-06 14:29:51

标签: c# treeview

此代码检查并取消选中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;
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

不确定这个名字。这是非常标准的,_callCountUp / Dn字段可以避免在更改节点的Checked属性时导致AfterCheck事件处理程序再次运行时出现问题。当事件处理程序无限制地递归时,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。当然这是可选的。