想在TREEVIEW实现这样的CHECKBOX效果
  若某节点的全部子节点都选中,则该节点的CHECKBOX显示黑色对勾图标,否则显示灰色对勾图标。 
  为此已在StateImageList加入了第三个图标(灰色对勾)。 
  但矛盾的是: 
  要显示第三个图标,应该使CheckBoxes = False,但这样就不能触发AfterCheck事件,而我又需要在AfterCheck事件中处理节点的CHECK状态。 
  要触发AfterCheck事件,必须使CheckBoxes = True,但这样又不能显示第三个图标。 
  请教各位,如何调和这一对矛盾?或者是否可以用其他办法来实现?

解决方案 »

  1.   

    对于某节点,若其全部子节点都选中,则该节点的CHECKBOX显示黑色对勾图标;若其部分子节点选中,则显示灰色对勾图标。
    StateImageList中的三个图标:
    第一个 空白
    第二个 黑色对勾
    第三个 灰色对勾
      

  2.   

    大家应该知道是什么样的效果吧?
    如果不知道可以看下WINDOWS附件-系统工具-备份中目录树的效果。
      

  3.   

    /// <summary>
            /// Set tree node checkbox state
            /// </summary>
            /// <param name="treeNode">tree node</param>
            /// <param name="checkboxState">checkbox state</param>
            private void SetTreeNodeState(TreeNode treeNode, CheckBoxState checkboxState)
            {
                IntPtr hWnd;
                TVITEM tvi;
                hWnd = this.Handle;            // Send a TVM_SETIMAGELIST with TVSIL_STATE.
                if (!_ImageListSent)
                {                SendMessage(hWnd, (UInt32)TVM_SETIMAGELIST, (UInt32)TVSIL_STATE, (UInt32)CheckBoxStateImageList.Handle);                 _ImageListSent = true;
                }            // The following uses the TVM_SETITEM message to set the State 
                // of a given item. It uses the TVITEM structure.            //  tvi.mask: include TVIF_HANDLE and TVIF_STATE
                tvi.mask = TVIF_HANDLE | TVIF_STATE;            // To use the State image, tvi.State cannot be 0.  
                //Setting it to 1 means to use the second image in the image list.
                tvi.state = (uint)checkboxState;
                // Left shift 12 to put info in bits 12 to 15
                tvi.state = tvi.state << 12;
                // Set StateMask. -This is required to isolate State above.
                tvi.stateMask = TVIS_STATEIMAGEMASK;            // Define the item we want to set the State in.
                tvi.hItem = treeNode.Handle;  //For example, try the root.            //  Initialize the rest to zero.
                tvi.pszText = (IntPtr)0;
                tvi.cchTextMax = 0;
                tvi.iImage = 0;
                tvi.iSelectedImage = 0;
                tvi.cChildren = 0;
                tvi.lParam = (IntPtr)0;            // Send the TVM_SETITEM message.
                //  TVM_SETITEM = 4365
                SendMessage(hWnd, (UInt32)TVM_SETITEM, (UInt32)0, ref tvi);            //Set Node State
                SetNodeState(treeNode, checkboxState);
            }
      

  4.   

    让TREEVIEW的CHECKBOX拥有三种状态.....
      

  5.   

    谢谢hyblusea!
    请问VB.NET可以用这种方法吗?
    可以用的话,劳驾把它转成VB.NET代码,在此先谢谢了!
      

  6.   

    参考C# WinForm开发系列 - TreeView
         摘要: 包含异步加载树,带拖动,多选,动画效果等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ).   阅读全文
      

  7.   

    谢谢peterb!
    感觉好复杂哦!(比起5楼的代码)
    正在研究......
    要学的东西还真多
      

  8.   

    9楼提供的资料中的三态TREEVIEW类,对我很有帮助!经过一番改造,实现了我想要的效果。
    再次谢谢peterb!