c#  treeview的checkd属性用法,怎样实现当我父节点没打勾的时候,子节点不能选(不能打勾)?求高手帮忙····

解决方案 »

  1.   


            private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
            {
                if (e.Node.Parent != null && e.Node.Parent.Checked == false)
                {
                    e.Cancel = true;
                }
            }
      

  2.   

    级联父子节点的复选框状态
    功能:如果某一节点被选中,选中该节点的所有子节点并展开,自动折叠其他同级节点。如果某一节点被去掉选中,去掉选中该节点的所有子节点并展开,自动折叠其他同级节点。如果该节点是其父节点的最后一个选中节点,且被去掉选中,去掉选中其父节点,折叠父节点。   
    private   void   tree_AfterCheck(object   sender,   System.Windows.Forms.TreeViewEventArgs   e)   
      {   
        
      TreeView   tree   =   (TreeView)   sender;   
      tree.AfterCheck   -=   new   System.Windows.Forms.TreeViewEventHandler(this.tree_AfterCheck);   
        
      //折叠其他同级节点   
      TreeNode   parentNode   =   e.Node.Parent;   
      if   (parentNode   !=   null)   
      {   
      foreach   (TreeNode   tn   in   parentNode.Nodes)   
      {   
      if   (tn   !=   e.Node)   
      tn.Collapse();   
      }   
      }   
      else   
      {   
      foreach   (TreeNode   tn   in   tree.Nodes)   
      {   
      if   (   tn   !=   e.Node)   
      tn.Collapse();   
      }   
      }   
        
      //标记该节点的所有子节点的选中状态与该节点一致   
      foreach   (TreeNode   tn   in   e.Node.Nodes)   
      tn.Checked   =   e.Node.Checked;   
        
      //if   (e.Node.Checked)   
      e.Node.ExpandAll(); //如果该节点为选中,展开该节点   
      //else   
      // e.Node.Toggle(); //如果该节点没有选中:如果该节点处于折叠状态,则展开该节点,否则折叠它   
        
      //如果当前节点的父节点下的所有子节点都没有选中,去掉父节点的选中   
      if   (e.Node.Checked   ==   false   &&   e.Node.Parent   !=   null)   
      {   
      bool   found   =   false; //父节点的子节点中至少有一个节点被选中,则found   =   true   
      foreach   (TreeNode   tn   in   e.Node.Parent.Nodes)   
      {   
      if   (tn.Checked   ==   true)   
      {   
      found   =   true;   
      break;   
      }   
      }   
      if   (   found   ==   false) //没有找到任何被选中的子节点   
      {   
      e.Node.Parent.Checked   =   false;   
      e.Node.Parent.Collapse();   
      }   
      }   
        
      tree.AfterCheck   +=   new   System.Windows.Forms.TreeViewEventHandler(this.tree_AfterCheck);   
      }  
      

  3.   

    当用户单击TreeView节点选择框时,程序自动将该节点的所有子节点的Check设置成该节点的状态.  
    实现以下功能:当用户单击节点选择框时,程序自动将该节点的所有子节点的Check设置成该节点的状态.
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    namespace TreeViewCheck
    {
        /// <summary>
        /// 树节点上下文Checked属性控制
        /// </summary>
        public static class TreeViewCheck
        {
            /// <summary>
            /// 系列节点 Checked 属性控制
            /// </summary>
            /// <param name="e"></param>
            public static void CheckControl(TreeViewEventArgs e)
            {
                if (e.Action != TreeViewAction.Unknown)
                {
                    if (e.Node != null)
                    {
                        CheckParentNode(e.Node, e.Node.Checked);
                    }
                    if (e.Node.Nodes.Count > 0)
                    {
                        CheckAllChildNodes(e.Node, e.Node.Checked);
                    }
                }
            }
            #region 私有方法
            //改变所有子节点的状态
            private static void CheckAllChildNodes(TreeNode pn, bool IsChecked)
            {
                foreach (TreeNode tn in pn.Nodes)
                {
                    tn.Checked = IsChecked;
                    if (tn.Nodes.Count > 0)
                    {
                        CheckAllChildNodes(tn, IsChecked);
                    }
                }
            }
            //改变父节点的选中状态
            private static void CheckParentNode(TreeNode curNode, bool IsChecked)
            {
                bool bChecked = true;
                if (curNode.Parent != null)
                {
                    foreach (TreeNode node in curNode.Parent.Nodes)
                    {
                        if (node.Checked == false)
                        {
                            bChecked = false;
                            break;
                        }
                    }
                    if (bChecked)
                    {
                        curNode.Parent.Checked = true;
                        CheckParentNode(curNode.Parent, true);
                    }
                    else
                    {
                        curNode.Parent.Checked = false;
                        CheckParentNode(curNode.Parent, false);
                    }
                }
            }
            #endregion
        }
    }
    //示例代码
     private void tv_AfterCheck(object sender, TreeViewEventArgs e)
    {
        TreeViewCheck.CheckControl(e);
    }