Winform 切换选中控件后,treeview的选中状态消失

2 篇文章 0 订阅

       做过winform 的童鞋都知道,页面上有treeview时,控件切换光标后,选中状态就消失了,这就给人一种很迷惑的感觉,不知道之前选中的哪一个,有人说了,设置treeView.HideSelection为false就好了,事实真的如此吗?答案是No,设置为false后,选中的节点颜色太浅了,几乎看不清,事实上我们只需在DrawNode中对节点重绘就好了,详细代码如下:

 /// <summary>
 /// 构造函数
 /// </summary>
 public FormDevicesManagement()
 {
     this.TV_Devices.DrawMode = TreeViewDrawMode.OwnerDrawText;
     this.TV_Devices.DrawNode += new DrawTreeNodeEventHandler(treeView_DrawNode);
 }

 private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
 {
    Rectangle rectangle = Rectangle.Inflate(e.Bounds, 0, -5);
    rectangle.Width += 15;
    if ((e.State & TreeNodeStates.Selected) != 0)
    {
        e.Graphics.FillRectangle(Brushes.DodgerBlue, e.Node.Bounds);

        Font nodeFont = e.Node.NodeFont;
        if (nodeFont == null) nodeFont = ((System.Windows.Forms.TreeView)sender).Font;
        
        e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, rectangle);
    }
    else
    {
        Font nodeFont = e.Node.NodeFont;
        if (nodeFont == null) nodeFont = ((System.Windows.Forms.TreeView)sender).Font;

        e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.Black, rectangle);
    }
  }

其中这两句,决定了文字的绘制位置:

Rectangle rectangle = Rectangle.Inflate(e.Bounds, 0, -5);
rectangle.Width += 15;

运行后,效果如下:

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WinForm中的TreeView件是一个用于显示层次结构数据的件,通常用于创建树形菜单或文件资源管理器等应用程序。它允许用户展开和折叠节点,并可以通过选择节点来执行相应的操作。 以下是一个简单的示例,演示如何使用WinForm中的TreeView件: ```csharp using System; using System.Windows.Forms; namespace TreeViewDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 添加根节点 TreeNode rootNode = new TreeNode("根节点"); treeView1.Nodes.Add(rootNode); // 添加子节点 TreeNode childNode1 = new TreeNode("子节点1"); TreeNode childNode2 = new TreeNode("子节点2"); rootNode.Nodes.Add(childNode1); rootNode.Nodes.Add(childNode2); // 添加子节点的子节点 TreeNode grandChildNode1 = new TreeNode("子节点1的子节点1"); TreeNode grandChildNode2 = new TreeNode("子节点1的子节点2"); childNode1.Nodes.Add(grandChildNode1); childNode1.Nodes.Add(grandChildNode2); } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { // 在选中节点后执行的操作 MessageBox.Show("选中节点:" + e.Node.Text); } } } ``` 在上述示例中,我们创建了一个名为"根节点"的根节点,并添加了两个子节点"子节点1"和"子节点2"。"子节点1"又有两个子节点"子节点1的子节点1"和"子节点1的子节点2"。当用户选择某个节点时,会弹出一个消息框显示选中的节点文本。 请注意,上述示例是一个简单的演示,你可以根据自己的需求进行更复杂的操作和定制化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不脱发的牧码人

你的鼓励将是我前进的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值