TreeView 和Checkbox 同步选中状态

 

        #region 选中checkbox事件

        private void updateTreeViewChecked(TreeViewEventArgs e)
        {
            TreeNode node = e.Node;
            checkAllChilds(node);
            checkAllParents(node);


        } 
        #endregion



        #region 用递归的方法同步所有字节点
        private void checkAllChilds(TreeNode treeNode)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = treeNode.Checked;
                if (node.Nodes.Count > 0)
                {
                    this.checkAllChilds(node);
                }

            }

        } 
        #endregion



        #region 用递归的办法同步所有父节点
        private void checkAllParents(TreeNode treeNode)
        {
            TreeNode parent = treeNode.Parent;
            if (parent != null)
            {
                //有一个子节点非checked状态,则父节点就是非checked状态
                if (parent.Checked && !treeNode.Checked) {
                    parent.Checked = false;
                    checkAllParents(parent);

                }
                    //如果所有的子节点都是checked状态,则父节点应该是checked状态
                else if (!parent.Checked && treeNode.Checked) {
                    bool allChecked = true;
                    foreach(TreeNode node in parent.Nodes){
                        if (!node.Checked) {
                            allChecked = false;
                            break;
                        }
                    }
                    if (allChecked) 
                    {
                        parent.Checked = true;
                    }
                }
            }
        }
        
        #endregion


posted on 2011-10-19 15:08  babyblue  阅读(239)  评论(0)    收藏  举报