最近做一个在TreeView上Check的功能,满足以下两点
1、如果一个Node的Check状态发生变化后,那么它所有的子节点的Check状态都变为和父节点的相同。
2、如果一个Node的Check状态变为True后,那么该节点的所有父节点的Check状态都应该变为True,一直追溯到根节点。以下是我的代码
private void tvTest_AfterCheck( object sender, TreeViewEventArgs e )
        {
            TreeNode curNode = e.Node;
            
            //改变父节点状态
            if ( null != curNode.Parent )
            {
                if ( curNode.Checked )
                {
                    if ( !curNode.Parent.Checked )
                    {
                        curNode.Parent.Checked = true;
                    }
                }
                else
                {
                    if ( curNode.Parent.Checked )
                    {
                        int i = 0;
                        for ( i = 0; i < curNode.Parent.Nodes.Count; ++i )
                        {
                            if ( curNode.Parent.Nodes[i].Checked )
                            {
                                break;
                            }
                        }                        if ( curNode.Parent.Nodes.Count == i )
                        {
                            curNode.Parent.Checked = false;
                        }
                    }
                }
            }            //改变子节点的Check状态
            for ( int i = 0; i < curNode.Nodes.Count; ++i )
            {
                curNode.Nodes[i].Checked = curNode.Checked;
            }
            
        }
    }但是现在这个代码最要命的就是,当任一节点的Check为True以后,那么所有节点的Check装态就变为True。原因很简单,当Parent的Check状态变为True后,触发了AfterChecke事件,那么它所有的子节点的Check也变为True,如此反复,就错了。现在不知道有没有什么办法能改变这个问题。一共就70分,全撒了!还请高手知道啊,可能在您看来就是一句话的事,但是我现在就陷里边了。谢谢!

解决方案 »

  1.   

    http://hi.csdn.net/invite.php?u=3370434&c=9cb528505d2f42a0 加好友谢谢!
      

  2.   


    我这个是C/S的,通过Vs2008做的
    不太明白你的意思啊
      

  3.   

    哦,c/s的,我以为是b/s的,网上的treeview控件应该也会有的
      

  4.   

    这个问题经过高人指点,豁然开朗,把代码贴上来给大家瞧瞧:private void tvTest_AfterCheck( object sender, TreeViewEventArgs e )
            {
                tvTest.AfterCheck -= tvTest_AfterCheck;
                try
                {
                    if ( null != e.Node.Parent )
                    {
                        ChangeParentCheckState( e.Node.Parent );
                    }                if ( 0 != e.Node.Nodes.Count )
                    {
                        foreach ( TreeNode treeNode in e.Node.Nodes )
                        {
                            ChangeChildCheckState( treeNode, e.Node.Checked );
                        }
                    }
                }
                finally
                {
                    tvTest.AfterCheck += tvTest_AfterCheck;
                }  
            }        /// <summary>
            /// 改变父节点的Check状态
            /// </summary>
            /// <param name="parentNode"></param>
            private void ChangeParentCheckState( TreeNode parentNode )
            {
                parentNode.Checked = true;            if ( null != parentNode.Parent )
                {                ChangeParentCheckState( parentNode.Parent );
                }
            }        /// <summary>
            /// 改变子节点的Check状态
            /// </summary>
            /// <param name="childNode"></param>
            /// <param name="checkState"></param>
            private void ChangeChildCheckState( TreeNode childNode, bool checkState )
            {
                childNode.Checked = checkState;
                if ( 0 != childNode.Nodes.Count )
                {
                    foreach ( TreeNode treeNode in childNode.Nodes )
                    {
                        ChangeChildCheckState( treeNode, checkState );
                    }
                }
            }需要说明的是,如果节点的Check状态变为false的话,只考虑子节点,并没有对父节点进行处理。