简体   繁体   中英

Show checkbox to root node in treeview C#

I wish to have checkbox to the root nodes and not the child nodes of the Treeview control. 样本图片

- [x]Pie Chart report 
    - Sales report
    - Sales Projection report
    - Linear Sales report

- [x]Surface Chart report
    - Sales report
    - Sales Projection report
    - Linear Sales report

- [x]Caligraph report
    - Sales report
    - Sales Projection report
    - Linear Sales report

To achieve this I have done change in my regular treeview control

tvreport is the Treeview Control

this.tvreport.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(tvreport_DrawNode);
this.tvreport.ShowLines = true;
this.tvreport.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;


    private void tvreport_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (IsContactNode(e.Node))
        {
            Color backColor, foreColor;
            if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
            {
                backColor = SystemColors.Highlight;
                foreColor = SystemColors.HighlightText;
            }

            if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)
            {
                backColor = SystemColors.HotTrack;
                foreColor = SystemColors.HighlightText;
            }
            else
            {
                backColor = e.Node.BackColor;
                foreColor = e.Node.ForeColor;
            }

            Rectangle newBounds = e.Node.Bounds;
            newBounds.X = 60;


            using (SolidBrush brush = new SolidBrush(backColor))
            {
                e.Graphics.FillRectangle(brush, e.Node.Bounds);
            }

            TextRenderer.DrawText(e.Graphics, e.Node.Text, this.tvreport.Font, e.Node.Bounds, foreColor, backColor);
            if ((e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused)
            {
                ControlPaint.DrawFocusRectangle(e.Graphics, e.Node.Bounds, foreColor, backColor);
            }
            e.DrawDefault = false;
        }

        else
        {
            e.DrawDefault = true;
            tvContactList1.ShowRootLines = true;
            tvContactList1.ShowLines = true;
        }

    }


    private bool IsContactNode(TreeNode node)
    {
        return node.Parent != null;
    }

After running the code have found that the root node is showing checkbox and childnodes is without checkbox [that is what I wish to have].

But the problem is the "Lines" that shows the hierarchy got disappeared. Now I want to populate those LINES. How can this be achieved.

TreeView Remove CheckBox by some Nodes is a possible solution. This solution sends TVM_SETITEM-Message to the treeview.

Taking help of above link, I could achieve my requirement. In below code HideCheckBox() function should be called only after populating nodes in the treeview.

            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;

            [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);

            /// <summary>
            /// Hides the checkbox for the specified node on a TreeView control.
            /// </summary>
            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);
            }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM