TreeView控件节点有选择的显示复选框

294 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

    #region 隐藏某些复选框
    /// <summary>
    /// 隐藏根节点复选框
    /// </summary>
    private void TreeNodeCheckBoxs()
    {
        this.TreeRule.CheckBoxes = true;
        this.TreeRule.ShowLines = true;
        this.TreeRule.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
        this.TreeRule.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(tvCheck_DrawNode);
    }
    private void tvCheck_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {

        if (e.Node.Text.Contains("区域") || e.Node.Text.Contains("警戒线"))   //需要隐藏checkbox的节点名称
        {
            HideCheckBox(this.TreeRule, e.Node);
        }

        e.DrawDefault = true;
    }

    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