【愚公系列】2023年09月 Winform控件专题 TreeView控件详解


前言

Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。

一、TreeView控件详解

Winform中TreeView控件是一种用于展示层级结构数据的控件,它类似于文件资源管理器中的树形结构。TreeView可以通过节点的展开与折叠实现对树形结构的浏览与操作。

TreeView控件可以通过添加节点实现对树形结构的构建。每个节点可以包含一个文本标签和任意数量的子节点。单击节点将选择它,并在TreeView的SelectedNode属性中存储它。可以通过设置节点的属性来自定义节点的显示效果,例如节点的文本、字体、图标等。

TreeView控件还可以处理节点的选择事件,例如在节点上单击鼠标时触发的事件。可以使用这些事件来处理节点的选择、展开、折叠等操作。此外,可以使用TreeView控件的搜索功能来查找特定的节点。

TreeView控件的高级用法包括使用数据绑定来动态填充树形结构以及使用扩展节点来为每个节点添加自定义数据。

1.属性介绍

1.1 Nodes

TreeView控件的Nodes属性是一个用于访问TreeView控件节点集合的属性。Nodes属性是一个TreeNodeCollection类型的对象,其中包含了所有TreeView控件的节点。

使用Nodes属性可以对树形结构进行动态的添加、删除、移动和访问等操作。下面是一些Nodes属性的常用方法:

  1. Add() 方法:向Nodes集合中添加新节点。

例如:

TreeNode rootNode = new TreeNode("Root"); // 创建根节点
treeView1.Nodes.Add(rootNode); // 添加根节点到TreeView控件
  1. Remove() 方法:从Nodes集合中删除指定的节点。

例如:

TreeNode selectedNode = treeView1.SelectedNode; // 获取选中的节点
if (selectedNode != null)
{
    
    
    treeView1.Nodes.Remove(selectedNode); // 从TreeView控件中删除该节点
}
  1. Clear() 方法:从Nodes集合中删除所有节点。

例如:

treeView1.Nodes.Clear(); // 清空TreeView控件中所有的节点
  1. Contains() 方法:判断Nodes集合中是否包含指定的节点。

例如:

if (treeView1.Nodes.Contains(selectedNode))
{
    
    
    MessageBox.Show("该节点存在于TreeView控件中!");
}
  1. Find() 方法:在Nodes集合中查找指定的节点。

例如:

TreeNode[] resultNodes = treeView1.Nodes.Find("SearchText", true); 
// 查找Nodes集合中标签为"SearchText"的节点,true表示查找所有子节点

在这里插入图片描述

通过使用Nodes属性,可以轻松地对TreeView控件中的节点进行操作,实现对树形结构的动态构建和编辑。

1.2 checkboxes

checkboxes属性用于启用或禁用TreeView节点的复选框。设置该属性为true时,TreeView节点会显示一个复选框,用户可以通过选择复选框来选择或取消选择该节点。设置该属性为false时,TreeView节点将不显示复选框。以下是使用示例:

private void Form1_Load(object sender, EventArgs e)
{
    
    
    // 添加根节点
    TreeNode rootNode = new TreeNode("根节点");
    this.treeView1.Nodes.Add(rootNode);

    // 添加子节点
    TreeNode childNode1 = new TreeNode("子节点1");
    TreeNode childNode2 = new TreeNode("子节点2");
    rootNode.Nodes.Add(childNode1);
    rootNode.Nodes.Add(childNode2);

    // 启用复选框
    this.treeView1.CheckBoxes = true;
}

在这里插入图片描述

注意:启用复选框后,选中节点的Checked属性将始终为true,即使用户取消选择节点时也是如此。如需获取节点的实际选择状态,请使用节点的IsChecked属性。

1.3 FullRowSelect

FullRowSelect属性是TreeView控件的一个属性,它规定是否整行选中节点。如果设置为True,则点击任意一列都会选中整行节点;如果设置为False,则只会选中点击的节点。

在Winform中,可以通过以下方式设置TreeView控件的FullRowSelect属性:

  1. 在设计时设置:

在Visual Studio的设计器中,选中TreeView控件,然后在属性窗口中找到FullRowSelect属性,将其设置为True或False即可。

  1. 在代码中设置:
treeView1.FullRowSelect = true; //设置为整行选中节点

在这里插入图片描述

注意:ShowLines为false

1.4 HideSelection

TreeView控件的HideSelection属性是一个布尔值,用于指定节点在失去焦点时是否仍然显示其选中状态。如果设置为true,则节点在失去焦点时会自动取消选中状态;如果设置为false,则节点仍然保持选中状态,直到其他节点被选中。

默认情况下,TreeView控件的HideSelection属性值为true。如果您想保留节点的选中状态,即使控件失去焦点,您可以将此属性设置为false。例如,您可能想在选择节点时显示相关信息,而不必担心失去焦点时信息会消失。

以下是示例代码,演示如何在使用TreeView控件时更改其HideSelection属性:

private void Form_Load(object sender, EventArgs e)
{
    
    
    // 将TreeView控件的HideSelection属性设置为false
    treeView1.HideSelection = false;
}

在设置了HideSelection属性后,您可以再次运行应用程序并尝试在TreeView控件上选择节点。即使TreeView控件失去焦点,选择的节点仍会保持其选中状态。
在这里插入图片描述

注意:DrawMode 为OwnerDrawText有效

1.5 HotTracking

TreeView控件中的HotTracking属性用于指定鼠标悬停在节点上时是否高亮显示该节点。当HotTracking属性设置为true时,鼠标悬停在节点上时,该节点的文本将被高亮显示。

可以通过以下代码设置TreeView控件的HotTracking属性:

treeView1.HotTracking = true;

1.6 ImageList、ImageIndex

TreeView控件是Windows Forms中一种常用的控件,可以实现树状结构的数据展示。在使用TreeView控件时,可以设置其ImageList和ImageIndex属性,实现对节点图标的定制。

ImageList属性是一个ImageList对象,用于管理TreeView控件中所有节点的图标。可以通过代码或者设计器添加图标到ImageList中。

ImageIndex属性是一个整数值,指定节点所使用的图标在ImageList中的索引值。例如,如果TreeView控件中需要显示一棵文件树,可以在ImageList中添加文件夹图标和文件图标,然后在每个节点中通过ImageIndex属性指定所使用的图标索引。

以下是使用ImageList和ImageIndex属性在TreeView中显示文件树的示例代码:

// 创建一个TreeView控件
TreeView treeView1 = new TreeView();

// 创建一个ImageList,并添加图标
ImageList imageList1 = new ImageList();
imageList1.Images.Add("folder", Image.FromFile("folder.png"));
imageList1.Images.Add("file", Image.FromFile("file.png"));
treeView1.ImageList = imageList1;

// 添加根节点
TreeNode rootNode = new TreeNode("Root");
rootNode.ImageKey = "folder";    // 指定文件夹图标索引
treeView1.Nodes.Add(rootNode);

// 添加子节点
TreeNode subdirNode = new TreeNode("SubDirectory");
subdirNode.ImageKey = "folder";    // 指定文件夹图标索引
rootNode.Nodes.Add(subdirNode);

TreeNode fileNode = new TreeNode("File.txt");
fileNode.ImageKey = "file";    // 指定文件图标索引
subdirNode.Nodes.Add(fileNode);

// 添加TreeView控件到表单中
this.Controls.Add(treeView1);

在上述代码中,通过创建一个ImageList对象并添加两个图标,然后将ImageList设置到TreeView控件的ImageList属性中。在每个节点中通过ImageIndex属性指定节点所使用的图标索引,实现了一个简单的文件树的展示。

1.7 Indent

TreeView控件的Indent属性指定每个树节点文本左侧的缩进量。默认值为20像素。

当树节点被展开时,其所有子节点将相对于父节点向右移动Indent个像素以显示层次结构。如果Indent的值太小,则节点文本可能过于接近树控件边缘或其他节点,而如果Indent的值过大,则可能会浪费空间。

可以使用如下代码设置TreeView控件的Indent属性:

// 设置TreeView控件的Indent属性
treeView1.Indent = 30;

这将会将TreeView控件中的每个节点文本左侧缩进30像素。

1.8 PathSeparator

TreeView控件中的PathSeparator属性用于设置节点的路径分隔符。默认情况下,这个属性的值为“\”(反斜杠),表示节点的路径是用反斜杠分隔的。

如果需要使用其他的路径分隔符,可以将PathSeparator属性设置为需要使用的分隔符。例如,如果需要使用斜杠“/”作为节点路径的分隔符,可以将PathSeparator属性设置为“/”。

以下是设置PathSeparator属性的代码示例:

// 将TreeView控件的PathSeparator属性设置为斜杠“/”
treeView1.PathSeparator = "/";

注意:更改PathSeparator属性的值可能会影响节点的路径属性值,从而导致节点的查找和操作出现问题。因此,在更改PathSeparator属性之前,请确保了解其作用和影响。

1.9 SelectedImageIndex、SelectedImageKey

TreeView控件的SelectedImageIndex和SelectedImageKey属性可以用于设置选中节点的图标。具体使用方法如下:

  1. 为TreeView控件的节点添加图标:
// 添加节点
TreeNode node = new TreeNode("节点名称");

// 设置节点的默认图标
node.ImageIndex = 0;

// 设置节点的选中图标
node.SelectedImageIndex = 1;

// 添加节点到TreeView控件中
treeView1.Nodes.Add(node);
  1. 使用ImageList控件管理TreeView控件节点的图标:
// 创建一个ImageList控件
ImageList imgList = new ImageList();

// 将图标添加到ImageList控件中
imgList.Images.Add("默认图标", Image.FromFile(@"default.png"));
imgList.Images.Add("选中图标", Image.FromFile(@"selected.png"));

// 设置TreeView控件的图标列表
treeView1.ImageList = imgList;

// 添加节点
TreeNode node = new TreeNode("节点名称");

// 设置节点的默认图标
node.ImageKey = "默认图标";

// 设置节点的选中图标
node.SelectedImageKey = "选中图标";

// 添加节点到TreeView控件中
treeView1.Nodes.Add(node);

在以上代码中,我们可以看到,当我们使用ImageList控件来管理图标时,可以使用图标的名称来设置节点的图标,便于管理和维护。

1.10 ShowLines、ShowNodeToolTips、ShowPlusMinus、ShowRootLines

ShowLines、ShowNodeToolTips、ShowPlusMinus、ShowRootLines是TreeView控件中常用的属性之一。

  1. ShowLines属性

ShowLines属性是TreeView控件的一个布尔类型属性,用于显示或隐藏节点之间的连线。其默认值为True,即默认情况下,节点之间会显示连线。如果想隐藏这些连线,可以将该属性设置为False。

  1. ShowNodeToolTips属性

ShowNodeToolTips属性是TreeView控件的一个布尔类型属性,用于显示或隐藏节点的工具提示。其默认值也是True,即默认情况下,当鼠标移动到节点上时,会显示节点的工具提示。如果想隐藏这些工具提示,可以将该属性设置为False。

  1. ShowPlusMinus属性

ShowPlusMinus属性是TreeView控件的一个布尔类型属性,用于显示或隐藏展开和折叠节点的加减号图标。其默认值也是True,即默认情况下,节点旁会显示加减号图标。如果想隐藏这些图标,可以将该属性设置为False。

  1. ShowRootLines属性

ShowRootLines属性是TreeView控件的一个布尔类型属性,用于显示或隐藏根节点和其子节点之间的连线。其默认值也是True,即默认情况下,根节点和其子节点之间会显示连线。如果想隐藏这些连线,可以将该属性设置为False。

这些属性的使用可以根据实际需要进行调整,以便更好地展示TreeView控件中的数据。

1.11 StateImageList

StateImageList属性用于设置节点的状态图像列表。它通常用于显示节点的选中状态、展开状态和折叠状态等。以下是使用StateImageList属性来设置TreeView控件节点状态的步骤:

  1. 创建或导入状态图像列表,通常是一张包含多个状态图像的图片,可以使用Visual Studio内置的ImageList控件创建或者使用外部图片文件导入。

  2. 将创建或导入的状态图像列表赋值给TreeView控件的StateImageList属性。可以使用属性窗口或代码进行设置。

  3. 设置TreeView控件节点的状态属性。每个节点具有三种基本状态:未选中、部分选中和选中状态。可以使用节点对象的Checked属性来设置节点的选中状态,使用TreeNodeStates枚举类型来设置节点的折叠和展开状态。

例如,以下代码将创建一个状态图像列表并将其分配给TreeView控件的StateImageList属性:

// 创建状态图像列表
ImageList stateImageList = new ImageList();
stateImageList.Images.Add(Properties.Resources.unchecked); // 未选中状态
stateImageList.Images.Add(Properties.Resources.checked); // 选中状态
stateImageList.Images.Add(Properties.Resources.partial_checked); // 部分选中状态

// 将状态图像列表分配给TreeView控件的StateImageList属性
treeView1.StateImageList = stateImageList;

然后,可以使用以下代码设置TreeView控件的节点状态:

// 创建根节点
TreeNode rootNode = new TreeNode("根节点");
rootNode.Checked = false; // 未选中状态
rootNode.StateImageIndex = 0; // 未选中状态图片的索引

// 创建子节点1
TreeNode childNode1 = new TreeNode("子节点1");
childNode1.Checked = true; // 选中状态
childNode1.StateImageIndex = 1; // 选中状态图片的索引

// 创建子节点2
TreeNode childNode2 = new TreeNode("子节点2");
childNode2.Checked = false; // 未选中状态
childNode2.StateImageIndex = 0; // 未选中状态图片的索引

// 添加子节点到根节点
rootNode.Nodes.Add(childNode1);
rootNode.Nodes.Add(childNode2);

// 将根节点添加到TreeView控件
treeView1.Nodes.Add(rootNode);

在这个例子中,根节点和子节点2的状态是未选中,使用索引0的状态图像;子节点1的状态是选中,使用索引1的状态图像。

2.常用场景

TreeView控件是Winform中常用的控件之一,它通常用于展示层级结构数据,例如文件系统、组织结构等。常用的场景包括:

  1. 文件管理:TreeView控件可以展示文件系统的目录结构,用户可以用它来浏览、选择、删除文件或文件夹。同时也可以通过自定义节点图标来区分文件和文件夹。

  2. 网站导航:TreeView控件可以用于展示网站结构,例如网站导航栏。通过设置节点的文本和链接属性,用户可以点击节点进入相关页面。

  3. 数据分类:TreeView控件可以用于展示层级的数据分类,例如商品分类。通过展开和折叠节点,用户可以方便地查看不同层级的分类信息。

  4. 组织架构:TreeView控件可以用于展示组织架构图,例如公司的员工层级关系。通过设置节点文本和节点图标,可以清晰地展示各个部门、职位和人员。

  5. 导航菜单:TreeView控件可以用于构建导航菜单,例如Winform应用程序的菜单。通过设置节点文本和节点图标,可以快速导航到相应的功能模块。

3.具体案例

下面是一个Winform中TreeView控件的完整案例,这个案例演示了如何使用TreeView控件来展示文件系统的目录结构,并且可以通过TreeView控件选择文件夹、展开和折叠节点。

首先,在Winform的设计视图中添加一个TreeView控件和一个Button控件。

然后,在Form1.cs文件中添加以下代码:

using System;
using System.IO;
using System.Windows.Forms;

namespace TreeViewDemo
{
    
    
    public partial class Form1 : Form
    {
    
    
        public Form1()
        {
    
    
            InitializeComponent();
            LoadTree();
        }

        private void LoadTree()
        {
    
    
            //获取计算机的根目录
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (DriveInfo drive in drives)
            {
    
    
                //创建根节点
                TreeNode rootNode = new TreeNode(drive.Name);
                rootNode.Tag = drive.RootDirectory;

                //添加到TreeView控件中
                treeView1.Nodes.Add(rootNode);

                //判断是否可以访问该驱动器,并添加子节点
                if (drive.IsReady)
                {
    
    
                    try
                    {
    
    
                        DirectoryInfo[] dirs = drive.RootDirectory.GetDirectories();
                        foreach (DirectoryInfo dir in dirs)
                        {
    
    
                            TreeNode node = new TreeNode(dir.Name);
                            node.Tag = dir;
                            rootNode.Nodes.Add(node);
                            node.Nodes.Add(new TreeNode()); //添加空节点,以便展开节点时加载子节点
                        }
                    }
                    catch (UnauthorizedAccessException)
                    {
    
    
                        //如果没有访问权限,则不添加子节点
                    }
                }
            }
        }

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
    
    
            //展开节点时加载子节点
            TreeNode node = e.Node;
            if (node.Nodes.Count == 1 && node.Nodes[0].Text == "")
            {
    
    
                node.Nodes.Clear();

                DirectoryInfo dir = (DirectoryInfo)node.Tag;
                try
                {
    
    
                    DirectoryInfo[] dirs = dir.GetDirectories();
                    foreach (DirectoryInfo subDir in dirs)
                    {
    
    
                        TreeNode subNode = new TreeNode(subDir.Name);
                        subNode.Tag = subDir;
                        node.Nodes.Add(subNode);
                        subNode.Nodes.Add(new TreeNode());
                    }
                }
                catch (UnauthorizedAccessException)
                {
    
    
                    //如果没有访问权限,则不添加子节点
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
    
    
            //获取选定的文件夹
            if (treeView1.SelectedNode != null)
            {
    
    
                DirectoryInfo dir = (DirectoryInfo)treeView1.SelectedNode.Tag;
                MessageBox.Show(dir.FullName);
            }
        }
    }
}

在LoadTree方法中,首先获取计算机的根目录DriveInfo[] drives = DriveInfo.GetDrives(),然后循环遍历每个根目录,创建根节点rootNode,并添加到TreeView控件中treeView1.Nodes.Add(rootNode)。

接着判断是否可以访问该驱动器,并添加子节点。如果没有访问权限,则不添加子节点。每个子节点都创建一个TreeNode,并将其加入到根节点rootNode中。为了方便展开节点时加载子节点,每个子节点都添加了一个空节点node.Nodes.Add(new TreeNode())。

在BeforeExpand事件中,判断当前节点是否已经加载过子节点。如果没有加载过,则将空节点删除,并加载该节点的子节点,并将它们加入到该节点的子节点集合中。同样地,如果没有权限访问子节点,则不添加子节点。

最后,在Button1的Click事件中获取选定的文件夹的全路径,如果没有选定任何节点,就不执行操作。

运行程序,将会在TreeView控件中展示计算机的根目录和子目录。可以通过TreeView控件选择文件夹,并通过Button控件获取选定的文件夹。同时,展开和折叠节点时会自动加载子节点。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/132894616