WinForm TreeView 树形控件

一、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存旧数据。