TreeView隐藏指定节点的CheckBox

因为TreeView 自身的CheckBox非常死,开启后所有的节点都会显示,但是很多场景下顶级节点是不需要显示CheckBox的,被迫通过重绘和SendMessage来解决这个问题。

this.treeView1.CheckBoxes = true;
this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeViewGroupStatements_DrawNode);//注册事件
#region 隐藏CheckBoxs

        //要隐藏的TreeNode的字典
        public Dictionary<string, bool> HideList = new Dictionary<string, bool>(); 
        private void treeViewGroupStatements_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
            HideLevelOfTreeView(e.Node);
            e.DrawDefault = true;

        }
        private void HideLevelOfTreeView(TreeNode tn)
        {
            //控制这个条件可以自定义显示checkbox的条件
            if (HideList.ContainsKey(tn.Text))
                HideCheckBox(tn.TreeView, tn);
        }

        //#endregion


        private const int TVIF_STATE = 0x8;
        private const int TVIS_STATEIMAGEMASK = 0xF000;
        private const int TV_FIRST = 0x1100;
        private const int TVM_SETITEM = TV_FIRST + 63;
        private void HideCheckBox(TreeView tvw, TreeNode node)
        {

            TVITEM tvi = new TVITEM();

            tvi.hItem = node.Handle;

            tvi.mask = TVIF_STATE;

            tvi.stateMask = TVIS_STATEIMAGEMASK;

            tvi.state = 0;

            SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);

        }

        [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]

        private struct TVITEM
        {
            public int mask;
            public IntPtr hItem;
            public int state;
            public int stateMask;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string lpszText;
            public int cchTextMax;
            public int iImage;
            public int iSelectedImage; public int cChildren; public IntPtr lParam;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);
        #endregion

猜你喜欢

转载自www.cnblogs.com/xxaxx/p/9051472.html