C#重写treeView控件
1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里

2.新建用户控件BaseTreeView控件


3.重写控件继承TreeView,记得删除AutoScaleMode这一行,否则会报错

public partial class BaseTreeView : TreeView
{//这个属性貌似不起作用,还是得配置BackColor不知道是咋回事private Color nodeNormalBackColor = Color.FromArgb(10, 52, 112);public Color NodeNormalBackColor{get{return nodeNormalBackColor;}set{nodeNormalBackColor = value;}}private Color nodeSelectBackColor = Color.FromArgb(15, 92, 164);public Color NodeSelectBackColor{get{return nodeSelectBackColor;}set{nodeSelectBackColor = value;}}private Color nodeHoverBackColor = Color.FromArgb(103, 161, 207);public Color NodeHoverBackColor{get{return nodeHoverBackColor;}set{nodeHoverBackColor = value;}}private Color nodeTestColor = Color.FromArgb(203, 239, 255);public Color NodeTestColor{get{return nodeTestColor;}set{nodeTestColor = value;}}public BaseTreeView(){InitializeComponent();this.DrawMode = TreeViewDrawMode.OwnerDrawAll;this.FullRowSelect = true;this.ItemHeight = 46;this.HotTracking = true;this.ShowLines = true;}protected override void OnDrawNode(DrawTreeNodeEventArgs e){base.OnDrawNode(e);//节点背景绘制if (e.Node.IsSelected){//e.Graphics.DrawImage(Properties.Resources.tree_bg, e.Bounds);e.Graphics.FillRectangle(new SolidBrush(nodeSelectBackColor), e.Bounds);}else if ((e.State & TreeNodeStates.Hot) != 0)//|| currentMouseMoveNode == e.Node){//e.Graphics.DrawImage(Properties.Resources.tree_bg, e.Bounds);e.Graphics.FillRectangle(new SolidBrush(nodeHoverBackColor), e.Bounds);}else if (e.Node.BackColor != null) {//这个是用于特殊单独需要在代码里设置结点背景颜色时使用Color color = e.Node.BackColor; // 获取背景色的全部分量e.Graphics.FillRectangle(new SolidBrush(color), e.Bounds);}else{e.Graphics.FillRectangle(new SolidBrush(nodeNormalBackColor), e.Bounds);}//节点头图标绘制if (e.Node.IsExpanded){e.Graphics.DrawImage(Resources.downdrop_open, e.Node.Bounds.X - 18, e.Node.Bounds.Y + 10);}else if (e.Node.IsExpanded == false && e.Node.Nodes.Count > 0){e.Graphics.DrawImage(Resources.downdrop, e.Node.Bounds.X - 18, e.Node.Bounds.Y + 10);}//文本绘制using (Font foreFont = new Font(this.Font, FontStyle.Regular))using (Brush drawTextBrush = new SolidBrush(nodeTestColor)){e.Graphics.DrawString(e.Node.Text, foreFont, drawTextBrush, e.Node.Bounds.Left + 15, e.Node.Bounds.Top + 5);}}protected override void OnMouseClick(MouseEventArgs e){base.OnMouseClick(e);TreeNode tn = this.GetNodeAt(e.Location);this.SelectedNode = tn;}TreeNode currentNode = null;protected override void OnMouseMove(MouseEventArgs e){base.OnMouseMove(e);TreeNode tn = this.GetNodeAt(e.Location);Graphics g = this.CreateGraphics();if (currentNode != tn){//绘制当前节点的hover背景if (tn != null)OnDrawNode(new DrawTreeNodeEventArgs(g, tn, new Rectangle(0, tn.Bounds.Y, this.Width, tn.Bounds.Height), TreeNodeStates.Hot));//取消之前hover的节点背景if (currentNode != null)OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));}currentNode = tn;g.Dispose();}protected override void OnMouseLeave(EventArgs e){base.OnMouseLeave(e);//移出控件时取消Hover背景if (currentNode != null){Graphics g = this.CreateGraphics();OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));}}/// <summary>/// 防止treeNode闪屏/// </summary>protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;if (!DesignMode){cp.ExStyle |= 0x02000000;// Turn on WS_EX_COMPOSITED }return cp;}}
}
4.重新生成程序,在工具箱中就会出现BaseTreeView控件,拉到界面中即可使用

5.在使用界面中为TreeView添加几个数据测试
//创建父节点
TreeNode treeNode = baseTreeView1.Nodes.Add("组织结构");//创建子节点
TreeNode treeNode_1 = new TreeNode("C");
TreeNode treeNode_2 = new TreeNode("C++");
TreeNode treeNode_3 = new TreeNode("C#");//给父节点添加子节点
treeNode.Nodes.Add(treeNode_1);
treeNode.Nodes.Add(treeNode_2);
treeNode.Nodes.Add(treeNode_3);
将文字设置大一点,背景颜色设置的深一点更好看


相关文章:
C#重写treeView控件
1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里 2.新建用户控件BaseTreeView控件 3.重写控件继承TreeView,记得删除AutoScaleMode这一行,否则会报错 public partial class BaseTreeView : TreeView {//这个属性貌似不起作用&…...
JS自动装箱(Auto-boxing)机制深度解析
📦 JS自动装箱(Auto-boxing)机制深度解析 自动装箱(Autoboxing) 是 JavaScript 的一项特性 🌟 核心概念速览 自动装箱 原始值临时变身对象 当对原始值调用方法或访问属性时,JS 引擎会自动将其转换为对应的包装对象&…...
ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题
背景 经过测试,Server 10.8.1、11.0、11.1发布相关服务设置动态空间之后,前端都无法自动读取同名的clr色彩映射表文件进行渲染,服务都是由ArcGIS Pro进行发布。 原因 基于ArcMap发布的服务才支持,但是10.8.1之后不支持ArcMap发…...
Java集合框架深度剖析:从数据结构到实战应用
引言 Java集合框架是Java开发中的核心组件之一,其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景,集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发,深入剖析其主流实现类࿰…...
【MySQL】监控MySQL
目录 使用状态变量监控MySQL 使用性能模式(Performance Schema)监控MySQL 1.性能模式 2.性能模式设置表 3.sys模式 使用状态变量监控MySQL 使用 show status 语句评估系统运行状况。 可以添加范围修饰符global或session来显示全局或本地状态信息。…...
涅槃上岸,入陕进军,复试全程流程开启!
复试决胜局,整装待发,上岸西电! 线下复试注意事项、全流程、录取后西安旅游提前告知! 过两天考研复试笔试、机试(如果有)、面试就要开始了,我们需要准备很多东西,学长从以下几个方面…...
msyql--基本操作之运维篇
检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限,如过没有localhost或者% 说明没有访问权限 添加…...
鸿蒙开发:openCustomDialog关闭指定Dialog
前言 本文基于Api13 openCustomDialog弥补了CustomDialogController在使用上存在的诸多限制,实现了可以在任意位置上弹出,可以说是非常的方便;但是,在使用的时候遇到了一些小阻碍,比如一个页面中可能存在多个弹窗&…...
es6 fetch
对比XHR 🛠️ fetch 所有配置项 fetch(url, {// 核心配置 method: GET, // HTTP 方法: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSheaders: { // 请求头(支持 Headers 对象或普通对象)Content-Type: applicati…...
Apache Tomcat RCE漏洞(CVE-2025-24813)
一,漏洞描述 该漏洞在于 Tomcat 在处理不完整PUT请求上传时,会使用了一个基于用户提供的文件名和路径生成的临时文件。 二,漏洞条件 1,默认 Servlet 启用了写权限(默认禁用) 2,启用了部分PUT…...
Apache HttpClient使用
一、Apache HttpClient 基础版 HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配…...
智能汽车图像及视频处理方案,支持视频星轨拍摄能力
美摄科技作为智能汽车图像及视频处理领域的先行者,正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质增强于一体的创新解决方案,旨在重塑智能汽车图像画质的新标准,并支持前…...
【微服务架构】本地负载均衡的实现(基于随机算法)
前言 负载均衡 概念:一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术,旨在提高系统的可用性、性能和可伸缩性。作用: 提高性能:通过将请求分散到多个实例上,避免单个实例因请求过多而过载ÿ…...
C盘急救实录:从爆红到畅快
极速救援通道(懒人专享) 老规矩,先上王炸方案!”小番茄C盘清理器”直达链接:https://cclean-cdn.xkbrowser.com/cleanmaster/FanQieClean_13046_st.exe 这个神器有三绝: 智能扫描引擎:能识别23…...
从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现
从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现 随着深度学习技术的发展,图像分割任务取得了长足的进步。本文将从一个具体的PyTorch代码实例出发,带大家了解一种 novel 的语义分割网络架构——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…...
openGl片段着色器的含义
片段着色器的含义及代码中的应用说明: 1. 片段着色器的基本概念 片段着色器(Fragment Shader)是OpenGL着色器管线中的关键组件,主要用于计算屏幕空间中每个片段(对应像素)的最终颜色。它是图形渲染流程的…...
ROS2 部署大语言模型节点
4GB GPU的DeepSeek-Coder 1.3B模型,并且它已经被量化或优化过。以下是具体的步骤: 安装必要的依赖项: pip install transformers torch grpcio googleapis-common-protos创建一个新的ROS 2包: cd ~/ros2_ws/src ros2 pkg creat…...
UART转APB模块ModelSim仿真
一、简介 之前介绍过一个UART转AHB模块,这个代码的框架有个好处,就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图,主要有三个状态机: (1) UART_RX_FSM将接收…...
【LeetCode 题解】算法:4.寻找两个正序数组的中位数
1. 引言:挑战 LeetCode 经典算法题 在算法这片广袤无垠的天地里,一道道经典题目宛如夜空中熠熠生辉的星辰,持续吸引着开发者们投身其中,不断探索。今天,我们继续将目光聚焦于 LeetCode 平台上一道极具代表性的题目&am…...
基于 SGLang 部署 Qwen2.5 7B 模型
本文将详细介绍如何使用 SGLang 快速部署 Qwen2.5 7B 模型,并深入探讨 SGLang 的关键性能优化技术,以及预期可以达到的延迟和吞吐量。 1. SGLang 框架介绍 SGLang 旨在解决 LLM 服务中的核心挑战: 高延迟: LLM 推理通常需要较长的计算时间,导致响应延迟高。低吞吐量: 由…...
Cesium 自定义路径导航材质
cesium 自定义路径导航纹理图片随便更换,UI 提供设计图片即可达到效果; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码; 拿到就能用轻松解决!帮忙点个关注吧!...
JDBC 连接字连接 KingbaseES支持主从负载均衡参数说明。
JDBC 连接字符串是用于连接 KingbaseES(人大金仓数据库)的,支持主从负载均衡。让我们逐一解析各个参数的作用,并探讨如何调整到最优。 参数解析 jdbc:kingbase8://10.10.14.19:54321/xxx_onlinejdbc:kingbase8://:指定…...
Java运行时的堆、栈和方法区
目录 1. 堆(Heap)存储内容与线程关系 2. 栈(Stack)存储内容与线程关系 3. 方法区(Method Area)存储内容与线程关系变动 1. 堆(Heap) 存储内容 对象实例(对象实例的全部数…...
【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)
BKP备寄存器 BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒࿰…...
卷积神经网络 - 参数学习
本文我们通过两个简化的例子,展示如何从前向传播、损失计算,到反向传播推导梯度,再到参数更新,完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络,其结构仅包含一个卷积层和一个输出…...
亮数据爬取API爬取亚马逊电商平台实战教程
前言 在当今数据驱动的商业环境中,企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而,传统的手动网页爬取方式面临着诸多挑战:IP封锁、验证码干扰、网站结构频繁变更,以及高昂的运维成本…...
[CLS] Token 在 ViT(Vision Transformer)中的作用与实现
[CLS] Token 在 ViT(Vision Transformer)中的作用与实现 1. 什么是 [CLS] Token? [CLS](classification token)是Transformer模型中一个可学习的嵌入向量,最初在 BERT(Bidirectional Encoder …...
基于网启PXE服务器的批量定制系统平台
项目概述 1.需求 公司新购了一批服务器和台式机,需要为台式机和服务器安装系统,一部分需要安装国产OpenEuler,一部分要求安装CentOS 7.9,同时也要满足定制化需求,即按要求分区安装相应软件。 2.使用开源软件 &…...
Reactor/Epoll为什么可以高性能?
在 Reactor 模式中使用 epoll_wait 实现低 CPU 占用率的核心原理是 事件驱动的阻塞等待机制,而非忙等待。以下通过分步骤解析其工作原理和性能优势: void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…...
-JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期
#JavaEE-HTTP-Servlet& 路由 & 周期 参考: https://blog.csdn.net/qq_52173163/article/details/121110753 1 、解释 Servlet 是运行在 Web 服务器或应用服务器上的程序 , 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数…...
