当前位置: 首页 > news >正文

【WinForm详细教程八】WinForm中的TreeView控件

文章目录

  • `TreeView` 基本的知识
    • 属性
    • 方法
    • 事件
  • `TreeView` 案例演示
    • 案例一:
    • 案例二:

TreeView 控件 用于展示分层数据,它以树形结构展示信息,每个节点可以有一个或多个子节点。TreeView 控件允许用户以可展开和可折叠的形式查看复杂的层次信息。

TreeView 基本的知识

属性

  • Nodes: 一个 TreeNodeCollection,包含控件的根节点。
  • SelectedNode: 获取或设置当前选中的 TreeNode。
  • CheckBoxes: 确定是否在每个树节点旁边显示复选框。
  • ShowPlusMinus: 确定是否显示用于展开和折叠树节点的加号和减号。
  • ShowLines: 确定是否显示树节点之间的连接线。

方法

  • BeginUpdate(): 暂停绘制控件,可以用于在添加大量节点时避免重绘,提高性能。
  • EndUpdate(): 恢复正常绘制控件,与 BeginUpdate() 配对使用。
  • CollapseAll(): 折叠所有的树节点。
  • ExpandAll(): 展开所有的树节点。
  • GetNodeAt(): 返回位于指定点的 TreeNode。

事件

  • AfterCheck / BeforeCheck: 在节点的复选框被用户选中或取消选中之后/之前发生。
  • AfterSelect / BeforeSelect: 在选择某个节点之后/之前发生。
  • AfterCollapse / BeforeCollapse: 在节点被折叠之后/之前发生。
  • AfterExpand / BeforeExpand: 在节点被展开之后/之前发生。
  • NodeMouseClick: 当鼠标单击 TreeNode 时发生。

节点介绍 - TreeNode

  • Name: 节点的唯一标识符。
  • Text: 节点显示的文本。
  • Nodes: 子节点的集合。

动态加载菜单表

  • 数据库中存储节点与子节点的关系,但层次关系不明显。
  • 动态加载数据到 TreeView 控件的流程:
    1. 从数据库获取表数据。
    2. 使用递归方法创建节点,并添加到 TreeView。
    3. 调用方法在 TreeView 中创建并显示层次结构数据。

TreeView 节点的勾选处理

  • 当父节点勾选或取消勾选时,所有子节点状态跟随变化。
  • 任一子节点勾选,父节点也应勾选。
  • 所有子节点都未勾选,父节点也不勾选。

TreeView 案例演示

案例一:

namespace WinFormsTest
{public partial class frmTreeView : Form{public frmTreeView(){InitializeComponent();}private void frmTreeView_Load(object sender, EventArgs e){TreeView fileTree = new TreeView();// 单独设置 Width 和 HeightfileTree.Width = 200;  // 设置宽度为200像素fileTree.Height = 600; // 设置高度为400像素// 或者使用 Size 属性同时设置宽度和高度fileTree.Size = new Size(200, 300); // 宽度200像素,高度400像素// 开始更新节点,防止在添加节点时进行重绘fileTree.BeginUpdate();TreeNode rootNode = new TreeNode("我的电脑");fileTree.Nodes.Add(rootNode);// 添加几个文件夹作为子节点TreeNode documentsNode = new TreeNode("文档");TreeNode picturesNode = new TreeNode("图片");TreeNode musicNode = new TreeNode("音乐");TreeNode videoNode = new TreeNode("视频");rootNode.Nodes.Add(documentsNode);rootNode.Nodes.Add(picturesNode);rootNode.Nodes.Add(musicNode);rootNode.Nodes.Add(videoNode);// 完成节点添加后,恢复控件的绘制fileTree.EndUpdate();fileTree.AfterSelect += new TreeViewEventHandler(fileTree_AfterSelect);this.Controls.Add(fileTree);}private void fileTree_AfterSelect(object sender, TreeViewEventArgs e){if (e.Node.Text != "我的电脑"){// 当用户选择一个节点时,显示选中节点的信息MessageBox.Show("选中的文件夹: " + e.Node.Text);}}}
}

效果:

动画10

案例二:

using System.Data;
using WinFormsTest.Helper;
namespace WinFormsTest
{public partial class frmTreeView2 : Form{public frmTreeView2(){InitializeComponent();}private void frmTreeView2_Load(object sender, EventArgs e){treeView1.Nodes.Clear();//清除所有节点//1. 获取数据DataTable dtMenus = DBHelper.GetDataTable("select Id,MName,ParentId from MenuInfos", 1);//3.调用方法,添加节点CreateNode(dtMenus, null, 0);}//2.添加节点(递归)private void CreateNode(DataTable dt, TreeNode pNode, int parentId){//1.获取要创建的节点数据DataRow[] rows = dt.Select("ParentId=" + parentId);if (rows.Length > 0){foreach (DataRow r in rows){//2.新建子节点TreeNode node = new TreeNode();node.Name = r["Id"].ToString();node.Text = r["MName"].ToString();//3.直接添加到TreeView Nodes  还是添加指定节点的Nodes里? if (pNode != null)pNode.Nodes.Add(node);elsetreeView1.Nodes.Add(node);//4.判断当前节点下有没有子节点//这个是递归,直到rows为0即当前节点没有子节点时结束递归CreateNode(dt, node, int.Parse(node.Name));}}}/添加父子勾选关联功能        
//1.父节点勾选或取消,它的所有子节点与它一致  
//2.只要有一个子节点勾选,父节点就勾选
//	子节点全部不勾选,父节点就不勾选bool isMouseClick = true;private void treeView1_NodeMouseClick_1(object sender, TreeNodeMouseClickEventArgs e){isMouseClick = false;//子节点勾选SetChildNodesState(e.Node);//父节点勾选SetParentNodeState(e.Node);isMouseClick = true;}private void treeView1_AfterCheck_1(object sender, TreeViewEventArgs e){if (isMouseClick){treeView1.SelectedNode = e.Node; //当前操作节点选中}}//递归处理子节点的勾选private void SetChildNodesState(TreeNode node){if (node.Nodes.Count > 0){foreach (TreeNode n in node.Nodes){n.Checked = node.Checked;SetChildNodesState(n);}}}private void SetParentNodeState(TreeNode node){TreeNode pNode = node.Parent;//获取父节点if (pNode != null){bool bl = false;foreach (TreeNode n in pNode.Nodes){if (n.Checked){bl = true;break;}}pNode.Checked = bl;SetParentNodeState(pNode);}}}
}

效果:

新建一个SQL数据库

image-20231107192018880

展示

请添加图片描述

添加父子勾选关联功能后

动画12

精彩推荐:
【C#进阶一】C#中的数组(Array)、集合(ArrayList,Queue,Stack, HashList)、List<T>、字典(Dictionary<K,T>)和双向链表LinkedList
【C#进阶八】C#中的序列化与反序列化下(二进制序列化、XML序列化及JSON序列化)

【C#进阶】C#语法中一些常用知识点总结
【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox
【WinForm详细教程三】WinForm中的NumericUpDown、PictureBox、RichTextBox及三种Timer控件
【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件
【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件
【WinForm详细教程六】WinForm中的GroupBox和Panel 、TabControl 、SplitContainer控件
【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式

如果你对智能建造专业感兴趣,或者是相关方向的学生,老师或者从业人员,欢迎通过微信公众号【智能建造小硕】加入我们!

在这里插入图片描述
希望有所帮助,同时欢迎关注我们,后面将更新更多相关内容!

相关文章:

【WinForm详细教程八】WinForm中的TreeView控件

文章目录 TreeView 基本的知识属性方法事件 TreeView 案例演示案例一:案例二: TreeView 控件 用于展示分层数据,它以树形结构展示信息,每个节点可以有一个或多个子节点。TreeView 控件允许用户以可展开和可折叠的形式查看复杂的层…...

〔003〕虚幻 UE5 基础教程和蓝图入门

✨ 目录 🎈 新建项目🎈 快捷操作🎈 镜头移动速度🎈 新建蓝图关卡🎈 打印字符串🎈 蓝图的快捷键🎈 场景中放置物体🎈 通过蓝图改变物体位置🎈 展现物体运动轨迹&#x1f3…...

如何像优秀测试人员那样思考?

优秀测试和普通测试之间的差别在于测试人员如何思考:测试人员的测试设计选择,解释所观察到的能力,以及非常令人信服地分析描述这些现象的能力。 然而,在实际工作中,我们更多的看到了测试人员在电脑前点点点&#xff0…...

NOIP2023模拟13联测34 A. origenNOIP2023模拟13联测34 A. origen

NOIP2023模拟13联测34 A. origen 文章目录 NOIP2023模拟13联测34 A. origen题目大意思路code 题目大意 给定 n n n 个整数 a 1 , a 2 , a 3 ⋯ a n a_1,a_2,a_3\cdots a_n a1​,a2​,a3​⋯an​ ,求 ∑ i 1 n ∑ j i n ( ⊕ k i j a k ) 2 m o d 998244353 \…...

HttpClient学习(Java)

一、介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 我们可以通过这个HttpClient工具,在java代码中去构造和发送ht…...

信息系统项目管理师之各工具的定义及解释

数据收集技术 用于从各种渠道收集数据与信息。 数据分析技术 用于组织评估和评价数据与信息。 数据表现技术 用于显示用来传递数据和信息的图形方式或其他方法。 决策技术 用于从不同备选方案选择行动方案。 沟通技巧 用于在干系人之间传递信息。 人际关系与团队技能…...

golang的defer执行时机案例分析

package main import "fmt"func calcFunc(x int, y int) int {return x y }func main() {// defer语句的执行顺序是,从右到左,逆序执行deferDemo()// deferDemo1函数demo1 : deferDemo1()fmt.Println(demo1) // 0// deferDemo2函数demo2 : deferDemo2()f…...

2.HTML中常用浏览器

2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示,运行的平台。常用的浏览器有IE,火狐,谷歌,Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核(渲染引擎):负责读取网页内容&…...

Vue 监听store数据变化

天冷了,手也冷了,于学问于个人成长不能因为冷而荒废。毕业这么多年,只能感慨。这样努力的工作只是解决了温保问题,何时才能任性的过一回说走就走的自由生活? 大抵这样的梦想也就只能停留在梦里与期待中吧,与…...

智能交通和自动驾驶技术

一、定义 智能交通和自动驾驶技术是指利用先进的信息技术和人工智能技术,实现交通系统的智能化和自动化。智能交通和自动驾驶技术不仅可以提高交通系统的效率和安全性,还可以改善人们的出行体验,促进城市可持续发展。 智能交通和自动驾驶技…...

CentOS7安装部署StarRocks

文章目录 CentOS7安装部署StarRocks一、前言1.简介2.环境 二、正文1.StarRocks基础1)架构图2)通讯端口 2.部署服务器3.安装基础环境1)安装JDK 112)修改机器名3)安装GCC4)关闭交换分区(swap&…...

树形Dp 2925. 在树上执行操作以后得到的最大分数

2925. 在树上执行操作以后得到的最大分数 两次DFS class Solution { public:// 节点状态有两种,选和不选,// dp(u, fa, 0) 不选u 节点,其他节点都可以选,值为以u为根的子树的所有节点的和- 根节点的值。// dp(u, fa, 1) 选u节点&…...

选择企业云盘?品牌推荐和评价解析

企业云盘是如今热门的企业协作工具,为企业提供了文件存储、文件共享服务。市面上的企业云盘千千万,到底哪个企业云盘好用?哪些品牌值得信赖呢? 好用的企业云盘,不能不提,Zoho Workdrive企业云盘为企业提供…...

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程,供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆,同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆,于是首先去查看了登陆功能的报错…...

数据资产、数字资产、数据资源及数据资产入表

数据要素 《中共中央关于坚持和完善中国特色社会主义制度推进国家治理体系和治理能力现代化若干重大的决议》(2019) 首次将数据列为生产要素 《关于构建更加完善的要素市场化配置体制机制的意见》(2020.3) 数据成为土地、劳动力、…...

Docker之Centos安装

介绍 Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的, 而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。 在很多版本的CentOS中是不支持更新最新的一些补丁包的。由于我们学习的环境都使用的是CentOS,因此这里我们将Do…...

SQL注入漏洞:CMS布尔盲注python脚本编写

SQL注入漏洞:CMS布尔盲注python脚本编写 文章目录 SQL注入漏洞:CMS布尔盲注python脚本编写库名爆破爆破表名用户名密码爆破 库名爆破 import requests #库名 database"" x0 while requests.get(urlf"http://10.9.47.77/cms/show.php?id33%20and%20length(data…...

security

Java Security 是一个用于在 Java 平台上提供安全性的框架。下面是 Java Security 的一些主要知识点: 1. 加密和解密:Java Security 提供了一组加密和解密 API,可以实现各种加密标准,如 AES、DES、RSA 等。 2. 数字签名&#xf…...

了解web3,什么是web3

Web3是指下一代互联网,它基于区块链技术,将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念,它包括了很多方面,如数字货币、去中心化应用、智能合约等等。听不懂且大多数人听到这个东西,直觉感觉就像骗子…...

Harbor企业级Registry基础镜像仓库的详细安装使用教程(保姆级)

Harbor Docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是vmware一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 ha…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...