在树视图中更改子节点的背景颜色

Posted

技术标签:

【中文标题】在树视图中更改子节点的背景颜色【英文标题】:Changing the backcolor of a childnode in the treeview 【发布时间】:2013-10-11 07:30:55 【问题描述】:

根据TreeView Remove CheckBox by some Nodes

这样做之后,我的tree-viewcheck-box 没有parent node check-box。 但是我遇到了一个问题,我无法更改特定子节点的颜色。

即。如果我尝试改变

treeview1.Nodes[0].Nodes[2].BackColor=Color.Gray;

仍然具有相同的旧颜色。 谁可以帮我这个事。 谢谢。

编辑

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

    /// <summary>
    /// Handles the DrawNode event of the treeView1 control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.Windows.Forms.DrawTreeNodeEventArgs"/> instance containing the event data.</param>
    /// <remarks></remarks>
    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
    
        if (e.Node.Level == 0)
            HideCheckBox(e.Node.TreeView, e.Node);
        e.DrawDefault = true;           
    




    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
              

        treeView1.Nodes[0].Nodes[1].BackColor = Color.Red;
    

【问题讨论】:

我测试了它,它对我来说工作正常。你在哪里称呼这个treeview1.Nodes[0].Nodes[2].BackColor=Color.Gray; 我在 treeView1_AfterSelect King 上调用它。你的父节点是复选框吗? 好吧,经过测试,它也可以工作。你的问题很奇怪。 国王你能告诉我你做得怎么样吗? 我完全按照你的描述做了。我使用了您发布的链接中的Cody Gray 代码,隐藏了我想要的复选框,然后将您发布的代码添加到AfterSelect 事件处理程序中,仅此而已。它工作正常。 【参考方案1】:

我已经按照您的方式进行了尝试(特别是 DrawNode 事件处理程序),我很确定您设置了 TreeView.DrawMode = TreeViewDrawMode.OwnerDrawText;。这不会绘制Background(仅Text)所以这就是BackColor 没有更新的原因。您必须将其设置为 TreeViewDrawMode.OwnerDrawAll

我将使用另一种方法来处理Hide 所有Child node checkboxes,而不使用DrawNode 事件处理程序。我会像这样向BeforeExpand 添加代码:

 //BeforeExpand event handler for your TreeView
 private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
   foreach (TreeNode node in e.Node.Nodes) 
       HideCheckBox(e.Node.TreeView, e.Node);
 

您还可以使用level&gt;0 遍历所有节点以隐藏复选框一次。然后,每当您向TreeView 添加更多节点时,如果不是level 0 node,则只需在添加后立即添加HideCheckBox

注意:当然,我上面提到的两种方法要求您将DrawMode 设置为Normal 以外的任何值。

【讨论】:

感谢国王这是问题所在...我使用的是 OwnerDrawText 而不是 OwnerDrawAll @Abin 是的,这就是我在回答中提到的。但是,我建议您使用我在答案中发布的两种方法。使用BeforeExpand 是最干净的方式。

以上是关于在树视图中更改子节点的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 选择样式更改所有子视图的背景颜色

选择时 UITableViewCell 背景颜色中的目标 c 子视图

多选模式下的 UITableView 删除选定单元格中所有子视图的背景颜色

更改 uitableview 单元格删除按钮背景颜色

隐藏子视图会在视图上留下微弱的阴影

设置子视图背景颜色不影响到父视图的背景颜色方法