none
求助有关WinForm当中的TreeNode重绘的问题。

    问题

  • 大家好,之前我做了一个WinForm实验程序。具体是想实现当按钮按下时,TreeView控件当中的选定的TreeNode重绘自己的外观。我在代码中给的重绘外观行为就是将其用红色底色填充。但这个实验程序始终不能成功,出现各种这样那样的问题。我把代码发上来请求大家帮忙看下。谢谢了。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace EXP
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                //初始化TreeView
                TreeNode rootnode = new TreeNode("根节点");
                TreeNode node1 = new TreeNode("子节点1");
                TreeNode node2 = new TreeNode("子节点2");
    
                rootnode.Nodes.Add(node1);
                rootnode.Nodes.Add(node2);
                treeView1.Nodes.Add(rootnode);
    
                treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
    
            }
           
            void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
            {
                label2.Text = e.Node.Text + "引发了事件。";   //如果将本函数下列代码全部注释掉,单这一句是正常执行的。
    
                treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
                
                treeView1.Invalidate(e.Bounds);     //语句1
                Graphics g = e.Graphics;
                Rectangle r = e.Bounds;
                g.FillRectangle(Brushes.Red, r);
                
                treeView1.Update(); //语句2
    
                treeView1.DrawMode = TreeViewDrawMode.Normal;   //语句3
    
            }
            
    
            private void button1_Click(object sender, EventArgs e)
            {
                //实验按钮
                if (treeView1.SelectedNode != null)
                {
                    treeView1.DrawTreeNode(treeView1.SelectedNode);
                }
                else
                {
                    label2.Text = "选择节点为空。";
                }
            } 
        }
    
        public class myTreeView : TreeView
        {
            public void DrawTreeNode(TreeNode node)
            {
                //为引发drawnode事件准备参数。
                DrawTreeNodeEventArgs arg = new DrawTreeNodeEventArgs(this.CreateGraphics(),
                                                                    node,
                                                                    node.Bounds,
                                                                    TreeNodeStates.Default);
                arg.DrawDefault = false;
                OnDrawNode(arg);
            }
        }
    }

    主要环节在treeView1_DrawNode函数,不是update进入死循环,就是绘制后把三个节点一起重绘了,大家能帮我看下到底是哪个方面出了问题吗?我只是想重绘一个节点就行。

    感觉那个update会重绘所有的节点,不管你之前指定的无效区域是哪一个节点。


    凝气神通

    2016年3月15日 7:18

答案

  • Hi PALadinWIC
    >>treeView1.Update(); //语句2
    TreeView.Update,TreeView.Refresh都会触发DrawNode事件,因此上面那句代码会引起死循环。
    如果你只是想要在按钮点击后高亮选中的节点,你可以修改节点的BackColor属性。
    范例代码:
     private void button1_Click(object sender, EventArgs e)
            {
                //实验按钮
                if (treeView1.SelectedNode != null)
                {
                    label2.Text = treeView1.SelectedNode.Text + "引发了事件。";  
                    treeView1.SelectedNode.BackColor = Color.Red;//修改背景色来实现高亮效果
                    //另一种方式
                    //Graphics g = treeView1.CreateGraphics();
                    //Rectangle rect = treeView1.SelectedNode.Bounds;
                    //g.FillRectangle(Brushes.Red, rect);
                }
                else
                {
                    label2.Text = "选择节点为空。";
                }
            }

    TreeView Class

    Regards,
    Moonlight


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2016年3月16日 6:22