一、TreeView 控件核心介绍
1. 控件作用
TreeView 是 WinForm 树形层级展示控件,用于展示层级结构数据(分类、菜单、文件目录、权限结构、多级菜单)。
结构分为:根节点 → 一级子节点 → 多级子节点,无限层级嵌套。
2. 核心对象关系(必考)
-
TreeView:整个树形控件容器
-
TreeNode:单个节点对象(每一条树项)
-
Nodes 集合:节点的子节点集合(List 集合结构)
二、核心属性大全
1. TreeNode 节点属性
-
Text:节点显示的文本内容
-
Parent:获取当前节点的父节点
-
Nodes:当前节点的所有子节点集合
2. TreeView 控件属性
-
Nodes:控件顶级根节点集合
-
SelectedNode:获取当前选中的节点
3. 核心方法
-
ExpandAll():展开所有层级节点
-
CollapseAll():折叠所有节点
-
Nodes.Add():添加节点
-
Nodes.Remove():移除指定节点
三、树形结构创建(静态多级节点)
原理流程
创建根节点 → 创建各级子节点 → 子节点挂载父节点 → 根节点挂载 TreeView → 展开全部
完整代码 + 逐行考点注释
cs
public Form1()
{
InitializeComponent();
// 1. 创建【根节点】
TreeNode root = new TreeNode("明星");
// 2. 创建一级子节点
TreeNode childNode1 = new TreeNode("小罗");
TreeNode childNode2 = new TreeNode("卡卡");
TreeNode childNode3 = new TreeNode("大罗");
// 3. 创建二级子节点(挂载在卡卡下)
TreeNode childNode2_1 = new TreeNode("卡卡1");
TreeNode childNode2_2 = new TreeNode("卡卡2");
TreeNode childNode2_3 = new TreeNode("卡卡3");
// 4. 二级节点挂载到一级节点 childNode2
childNode2.Nodes.Add(childNode2_1);
childNode2.Nodes.Add(childNode2_2);
childNode2.Nodes.Add(childNode2_3);
// 5. 一级节点挂载到根节点
root.Nodes.Add(childNode1);
root.Nodes.Add(childNode2);
root.Nodes.Add(childNode3);
// 6. 根节点挂载到 TreeView 控件
treeView1.Nodes.Add(root);
// 7. 默认展开所有层级
treeView1.ExpandAll();
}
四、动态新增子节点(按钮添加)
核心逻辑
获取根节点 → 向根节点的子节点集合 Add 新节点
cs
private void button1_Click(object sender, EventArgs e)
{
// 新建节点
TreeNode t1 = new TreeNode("string");
// treeView1.Nodes[0] 代表第一个根节点
// 向根节点的子节点集合添加新节点
treeView1.Nodes[0].Nodes.Add(t1);
}
五、动态删除指定节点(重点必考)
易错点
禁止正序遍历删除:会导致集合索引错乱、漏删、报错。
✅ 正确写法:倒序遍历删除(从后往前遍历)
完整删除代码
cs
private void button2_Click(object sender, EventArgs e)
{
// 倒序遍历根节点下所有子节点
for (int i = treeView1.Nodes[0].Nodes.Count - 1; i >= 0; i--)
{
TreeNode t1 = treeView1.Nodes[0].Nodes[i];
// 匹配节点文本
if (t1.Text == "string")
{
// 通过父节点集合移除自身
t1.Parent.Nodes.Remove(t1);
}
}
}
删除核心考点
-
t1.Parent.Nodes.Remove(t1):节点不能自己删自己,必须通过父节点集合删除 -
倒序遍历是 TreeView / List 删除数据的标准写法
六、节点点击事件(NodeMouseClick)
超级重点:两个取值区别(必考坑点)
cs
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
// ❌ 旧值:上一次选中的节点(有延迟)
Console.WriteLine(treeView1.SelectedNode.Text);
// ✅ 实时值:当前刚刚点击的节点(正确取值)
Console.WriteLine(e.Node.Text);
}
坑点解析
-
treeView1.SelectedNode:点击瞬间还未更新,拿到的是「上一次选中节点」
-
e.Node:事件参数自带,永远是当前点击的最新节点
七、TreeView 全套易错点总结
-
节点是 多层嵌套:控件.Nodes 是根层级,节点.Nodes 是子层级
-
删除节点必须通过 父节点集合删除,节点自身不能自我移除
-
遍历删除必须 倒序循环,正序会索引错乱
-
点击事件取值优先用e.Node,不要用 SelectedNode
-
新增节点后无需刷新,TreeView 自动渲染
八、TreeView 专属背诵口诀
Tree树形层级多,根节点挂最外层;
子节点加Nodes里,展开全用ExpandAll;
删除必须倒序跑,父集移除子对象;
点击取值用eNode,Selected存旧数据。