C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

2023-11-03

在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,首先需要实现类似于资源管理器的界面,通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.显示结果如下图所示:

一. 界面设计

主窗体是一个Windowss窗体文件,工程命名为SecureTree.分别从工具箱中左边拖一个TreeView控件,名称(Name)为directoryTree;右侧文件列表ListView控件,名称为filesList.
然后从工具箱中拖两个ImageList控件,分别命名为directoryIcons和filesIcons.右键directoryIcons点击"选择图像",从本地Resource文件夹中添加图片如下图所示5张图片,同理filesIcons添加Closed Folder.ico图标.

添加完成后,指定directoryTree控件的ImageList属性为directoryIcons,filesList控件的SmallImageList属性为filesIcons绑定图标.我上传了常用的ICON图标免费资源:http://download.csdn.net/detail/eastmount/6934111

二. 代码实现

1.添加IconIndexes枚举类型类,这个枚举类型值与之前添加到directoryIcons图标对应.这样TreeView控件便可显示该结点相对应的图标.

/// <summary>
/// IconIndexs类 对应ImageList中5张图片的序列
/// </summary>
private class IconIndexes
{
    public const int MyComputer = 0;      //我的电脑
    public const int ClosedFolder = 1;    //文件夹关闭
    public const int OpenFolder = 2;      //文件夹打开
    public const int FixedDrive = 3;      //磁盘盘符
    public const int MyDocuments = 4;     //我的文档
}

2.添加响应主窗体的Load事件,在窗体加载后,获取最顶层电脑驱动器和我的文档信息并加载到TreeView控件中.并添加命名空间:using System.IO;

/// <summary>
/// 窗体加载Load事件 初始化
/// </summary>
private void Form1_Load(object sender, EventArgs e)
{
    //实例化TreeNode类 TreeNode(string text,int imageIndex,int selectImageIndex)            
    TreeNode rootNode = new TreeNode("我的电脑",
        IconIndexes.MyComputer, IconIndexes.MyComputer);  //载入显示 选择显示
    rootNode.Tag = "我的电脑";                            //树节点数据
    rootNode.Text = "我的电脑";                           //树节点标签内容
    this.directoryTree.Nodes.Add(rootNode);               //树中添加根目录

    //显示MyDocuments(我的文档)结点
    var myDocuments = Environment.GetFolderPath           //获取计算机我的文档文件夹
        (Environment.SpecialFolder.MyDocuments);
    TreeNode DocNode = new TreeNode(myDocuments);
    DocNode.Tag = "我的文档";                            //设置结点名称
    DocNode.Text = "我的文档";
    DocNode.ImageIndex = IconIndexes.MyDocuments;         //设置获取结点显示图片
    DocNode.SelectedImageIndex = IconIndexes.MyDocuments; //设置选择显示图片
    rootNode.Nodes.Add(DocNode);                          //rootNode目录下加载节点
    DocNode.Nodes.Add("");

    //循环遍历计算机所有逻辑驱动器名称(盘符)
    foreach (string drive in Environment.GetLogicalDrives())
    {
        //实例化DriveInfo对象 命名空间System.IO
        var dir = new DriveInfo(drive);
        switch (dir.DriveType)           //判断驱动器类型
        {
            case DriveType.Fixed:        //仅取固定磁盘盘符 Removable-U盘 
                {
                    //Split仅获取盘符字母
                    TreeNode tNode = new TreeNode(dir.Name.Split(':')[0]);
                    tNode.Name = dir.Name;
                    tNode.Tag = tNode.Name;
                    tNode.ImageIndex = IconIndexes.FixedDrive;         //获取结点显示图片
                    tNode.SelectedImageIndex = IconIndexes.FixedDrive; //选择显示图片
                    directoryTree.Nodes.Add(tNode);                    //加载驱动节点
                    tNode.Nodes.Add("");                          
                }
                break;
        }
    }
    rootNode.Expand();                  //展开树状视图
}

代码首先用TreeNode(string text,int imageIndex,int selectImageIndex)实例化一个根节点"我的电脑"(该结点没指定路径),其3个参数分别是:结点名称、加载时显示图标,选中结点时显示图标,通过IconIndexes类枚举访问.然后通过GetFolderPath(Environment.SpecialFolder.MyDocuments)获取MyDocuments(我的文档)文件夹路径,并添加为第一个字结点,同时调用foreach循环遍历逻辑磁盘盘符,DriveType判断固定磁盘加载至子结点.其中代码tNode.Nodes.Add("")是加载空节点,使"我的文档"和"CDEFG盘"显示+号.当点击加号时,后面的代码会清除该结点.

3.添加TreeView的AfterExpand事件和BeforeExpand事件.分别是展开结点后实现展开,将要展开前实现加载子目录结点.选择文件夹时会显示不同icon图标.

/// <summary>
/// 在结点展开后发生 展开子结点
/// </summary>
private void directoryTree_AfterExpand(object sender, TreeViewEventArgs e)
{
    e.Node.Expand();
}

/// <summary>
/// 在将要展开结点时发生 加载子结点
/// </summary>
private void directoryTree_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    TreeViewItems.Add(e.Node);
}

/// <summary>
/// 自定义类TreeViewItems 调用其Add(TreeNode e)方法加载子目录
/// </summary>
public static class TreeViewItems
{
    public static void Add(TreeNode e)
    {
        //try..catch异常处理
        try
        {
            //判断"我的电脑"Tag 上面加载的该结点没指定其路径
            if (e.Tag.ToString() != "我的电脑")
            {
                e.Nodes.Clear();                               //清除空节点再加载子节点
                TreeNode tNode = e;                            //获取选中\展开\折叠结点
                string path = tNode.Name;                      //路径  

                //获取"我的文档"路径
                if (e.Tag.ToString() == "我的文档")
                {
                    path = Environment.GetFolderPath           //获取计算机我的文档文件夹
                        (Environment.SpecialFolder.MyDocuments);
                }

                //获取指定目录中的子目录名称并加载结点
                string[] dics = Directory.GetDirectories(path);
                foreach (string dic in dics)
                {
                    TreeNode subNode = new TreeNode(new DirectoryInfo(dic).Name); //实例化
                    subNode.Name = new DirectoryInfo(dic).FullName;               //完整目录
                    subNode.Tag = subNode.Name;
                    subNode.ImageIndex = IconIndexes.ClosedFolder;       //获取节点显示图片
                    subNode.SelectedImageIndex = IconIndexes.OpenFolder; //选择节点显示图片
                    tNode.Nodes.Add(subNode);
                    subNode.Nodes.Add("");                               //加载空节点 实现+号
                }
            }
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.Message);                   //异常处理
        }
    }
}

注意事项:
(1).该项目中"我的电脑"是作者自定义的root节点,没有设定其路径,所以BeforeExpand事件中会从它开始依次遍历,但"我的电脑"会提示"没有指定路径".故需要if(e.Tag.ToString() != "我的电脑")判断.同时"我的文档"需要再次获取其路径,依次实现Add子节点;
(2).同时在"我的文档"和盘符中需要添加tNode.Nodes.Add("")加载空节点形成+号,如果没有该+号,BeforeExpend事件不会被调用,子目录无法获取加载,在BeforeExpand事件调用TreeViewItems.Add加载其子结点需要e.Nodes.Clear();清除该结点的子目录再加载.
(3).提供两篇类似文章供大家学习,经过对比可以发现:第一篇仅从驱动器(C盘)开始加载,所以BeforeExpend简单展开子目录即可,不需要判断"我的电脑"和"我的文档".第二篇含"桌面",因此需要判断路径:"
C# TreeView磁盘文件,AfterSelect显示加号-骆驼祥子" 和"Treeview树状显示文件夹" .同时补充一篇很优秀的文章供大家学习"WinForm应用:ListView做图像浏览"
(4).补充TreeView(树视图)事件:更详细见"c# 树状视图(TreeView类)".

事件 描述
AfterCheck 在选中节点复选框后引发
AfterCollapse 在折叠一个节点后引发
AfterExpand 在扩展一个节点后引发
AfterSelect 在选中一个节点后引发
BeforeCheck 在选中节点复选框之前引发
BeforeCollapse 在折叠一个节点之前引发
BeforeExpand 在扩展一个节点之前引发
BeforeSelect 在选中一个节点之前引发

(5).补充两个关于论坛讨论"c#怎样动态读取资源文件里的图片"和"在C#中怎么调用Resources文件中的图片"
(6).在《C#典型模块与项目实战大全》(清华大学出版社-丁士锋)书中谈到,出于对程序响应性能考虑,它先加载盘符结点,没有使用递归一次性加载所有文件到树状列表中,代码通过AfterSelect事件和FileSystemWatcher控件,监听加载.并使用线程池Task更新加载TreeView,希望大家去学习.

三. 总结

该篇通过TreeView加载了磁盘目录路径,并通过ImageList加载图标.那么怎样实现阅读文件夹下文件,获取其图标、文件大小、扩展名等信息,并双击打开文件呢?下一篇将接着讲述.最后希望该文章对大家有所帮助,文章中很多链接都可以供觉得有用的同学学习,感谢上面提到的文章及书籍作者.同时如果文章中有错误或不足之处请原谅,有问题或建议者亦可提出.希望尊重作者劳动果实勿喷.
资源下载地址:http://download.csdn.net/detail/eastmount/6937355
想使用C++ MFC实现同样功能的文章见:http://blog.csdn.net/eastmount/article/details/19120567
(By:Eastmount 2014-2-19 下午3点http://blog.csdn.net/eastmount/)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标 的相关文章

  • JavaFX 树视图不显示任何项目

    我尝试在我的 JavaFX 应用程序中实现 TreeView 但不幸的是没有显示任何项目 但我找不到问题 我搜索了一些例子并像他们一样做了 我将 TreeView 控件放入 SceneBuilder 中的 FXML 文件中 并选择生成的 C
  • TreeView 不显示存储在数据中的子项

    在我的程序中我有一个TreeView具有数据支持 视图模型和数据模型 添加到的每个项目TreeView添加一个子项 但由于某种原因 子项在运行时没有反映 但是 我可以在调试期间看到孩子们以及我的 孩子 属性TreeView s数据模型包括N
  • 在c#中的TREEVIEW中添加复选框

    我想添加复选框到我的应用程序中树视图中某个父节点的子节点 我应该如何添加它 TreeView拥有一个名为CheckBoxes 如果设置为true 它显示所有子节点的复选框
  • WPF TreeView:如何使控件相对于每个 TreeViewItem 对齐,但仍然获得标题文本的缩进效果?

    这是我想要实现的目标的直观想法 我希望左侧和右侧的所有按钮都垂直对齐 无论 TreeViewItem 位于树中的哪个位置 我在实现这种效果时遇到了困难 同时也让标题以典型的嵌套方式缩进 我最近的尝试涉及修改 TreeViewItem 模板
  • WPF TreeView刷新

    我有一个问题 我用TreeView在我的 WPF 项目中可视化我的 XML 数据 问题是 当我编辑我的XmlDocument它不会刷新TreeView 但我注意到当我检查时SelectedNode 这是我编辑的XmlNode 所以我的 编辑
  • 如何在 tkinter 中滚动到 TreeView 的底部

    我在 Tkinter 中使用树视图模仿了一个表格小部件 并添加一个链接到它的滚动条 问题是因为我的数据是按分钟自动添加到底部的 并且我希望滚动始终滚动到底部 我知道 text see END 在文本小部件中完美工作 但就我而言 树视图小部件
  • 使用目录树和过滤填充 TTreeView

    在 Lazarus 0 9 28 2 项目上我有一个TTreeView 与名字DirTree在我的表格上 frmConvert 但我想用所有目录树填充它 因为C 像这样 C 目录树 http i imagehost org 0185 cdi
  • TreeView 中的多项选择

    我正在使用 Windows 窗体TreeView在我的程序中进行控制 我想允许用户通过拖动鼠标指针来选择同一级别的多个节点 也称为 套索 选择 我认为没有标准TreeView允许这样做 我的问题是实现这一目标的最佳方法是什么 我是否必须在自
  • 在 QTreeView 中的文本之前显示图标

    I m using QtRuby with Qt 4 8 6 and trying to create a tree view where each item has a custom icon between the tree contr
  • 如何使用 php 列出目录以在文件夹中导航,而不使用 javascript? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找这个 PHP 函数 列出目
  • WPF TreeView ObservableCollection 通知示例代码

    我正在尝试编写一个 C WPF 应用程序 但我被 TreeView 和 ObservableCollection 困住了 这是我的 TreeView 项目 Root SubItem SubItem Root SubItem SubItem
  • 如何确定所选节点是 TreeView 中的子节点还是父节点?

    如何判断所选节点是子节点还是父节点TreeView控制 具体如何实现此类检查取决于您如何定义 子 和 父 节点 但每个都暴露了两个属性TreeNode提供重要信息的对象 The Nodes财产 http msdn microsoft com
  • ExtJS TreeGrid 中的复选框列

    有没有办法在新的 extjs 小部件 TreeGrid 中包含复选框列 将节点属性标记为 false true 并不像 TreePanel 那样有效 Cheers 我修改了 Ext ux tree TreeGridNodeUI 类来实现此功
  • MS Access 2016 树视图错误:“此控制元素中没有对象。运行时错误 438”

    我在 MS Access 中打开树视图时遇到问题 我认为这是自上次 Windows 更新以来的情况 当我启动程序时收到一条错误消息 此控制元素中没有对象 运行时错误 438 对象 不支持此属性或方法 调试器将 vba 代码中的一行标记为黄色
  • 如何阻止TreeItem选择?

    我正在与一个TreeTableView JavaFX 8 有一些树节点必须禁用才能选择 我已经尝试过选择活动 但它不起作用 请查找以下代码以获取更多信息 treeTableView getSelectionModel selectedIte
  • 在 jsTree 上下文菜单中创建自定义项目

    我在 asp net mvc3 中使用 jsTree 和 contextmenu 创建一个树视图 div ul li a href class usr Model Name a Html Partial Childrens Model li
  • Ttk Treeview:跟踪键盘选择

    这是一个带有 ttk 树视图的 Tk 小部件 当用户单击该行时 会执行某些功能 此处仅打印项目文本 我需要的是以下内容 最初的重点是文本输入 当用户按下 Tab 键时 焦点应该转到第一行 并且应该执行绑定到 Click 事件的函数 当用户使
  • WinForms TreeView - 如何手动“突出显示”节点(就像被单击一样)

    我需要知道如何让以编程方式选择的节点以图形方式处于 选定 状态 就像用户单击它一样 SelectedNode 仅使这一节点在内部被选中 非常感谢 它没有显示为突出显示的原因是由于树视图没有焦点 这是我的测试表单上的按钮单击事件 TreeVi
  • 双击 TreeNode 复选框上的行为

    我有一个TreeView填充有TreeNodes有图标和复选框 我一直在尝试禁用其中一些人的检查 取消检查能力 从而丢弃事件中的事件BerforeCheck方法 这工作正常 直到我双击复选框 复选框的图像与其真实状态相反 如果状态为Chec
  • 如何使用 WPF 从 XML 文件创建树视图?

    这是 XML 文件

随机推荐

  • 问题问题三道杠

    阿萨德
  • [从零开始学习FPGA编程-50]:视野篇 - 芯片是如何被制造出来的?芯片制造的十三大步骤。

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 什么是芯片 一颗芯片就是一个城市 总体流程
  • caffe(五)Solver解析

    Solver src caffe solver cpp Init template
  • linux硬链接与软链接

    http www cnblogs com sonic4x archive 2011 08 05 2128543 html 1 Linux链接概念 Linux链接分两种 一种被称为硬链接 Hard Link 另一种被称为符号链接 Symbol
  • flink onTimer定时器实现定时需求

    1 业务需求 接收实时数据流数据 实时更新状态 并且每隔一定的时间 将所有状态数据输出 实时数据类型 张 1 状态更新 第一个元素为key 将第二个元素全部缓存起来 放到list中 最后将key和其对应的list全部输出 2 实现方案 使用
  • 充电管理芯片中的一些特性说明

    1 电源路径管理 Power Path 使用非电源路径架构时 系统输入和电池电极连接到相同的充电器输出节点 如下图所示 这种架构有很多局限 如果电池深度放电或者有缺陷 那么即使连接外部电源 也可能无法启动系统 即无法优先给负载供电 在系统启
  • 解决“nothing added to commit but untracked files present“

    在执行git commit 命令时错误信息显示系统无法打开指定的设备或文件 说明项目的文件没有 add 需要先执行git add 文件名 然后再执行git commit m xxx 错误解决如下 依次将各个文件 git add 然后再进行原
  • 计算机机房一般在几楼,21层的楼房设备层一般在几楼

    目前高层楼房的设备层一般在地下室 一层和屋面 除了基层之外一般都不会有设备在其他楼层的情况 所以21层楼房设备层应该也是在这些楼层 通常地下室是高层建筑设备最密集的地方 各类强电 弱电 生活水 消防水 污水处理等设备间都会在地下室 当然也有
  • Python操作xlwings

    xlwings的安装 xlwings库使用pip安装 在控制台输入 pip install xlwings 工作簿操作 coding UTF 8 导入所需的第三方模块 import xlwings as xw 关闭警告 屏幕刷新 app d
  • 1.elasticsearch文档存储(保存

    README 0 本文部分内容 数据 总结自 es 开发文档 Document APIs Elasticsearch Guide 7 2 Elastic 1 本文的es版本是7 2 1 2 elasticsearch 是一个数据存储 检索和
  • ROC,AUC,PR

    1 召回率 准确率 ROC曲线 AUC PR曲线这些基本概念 这个是今天的重点 传统机器学习里面也是很重要的一点 刚好可以重新学习一下 像AUC其实它就是一个用来评判你的一个模型的准确率的 因为在普通的正确率中 会因为样本的不平衡 而正确率
  • 人物角色群体攻击判定(三)Physics.OverlapSphere(群体攻击)

    使用Physics OverlapSphere来检测不方便调试 其他都可以 核心代码 检测敌人 public void CheckEnemy Collider cols Physics OverlapSphere this transfor
  • 数组模拟环形队列(思路分析) [数据结构与算法][Java]

    数组模拟环形队列 思路分析 使用数组模拟环形队列 就可以解决使用数组模拟队列中的遗留问题了 那么我们要如何使用数组模拟环形队列 相当于前面讲过的数组模拟非环形队列 也就是一般队列 我们这里有如下的变化 front变量的含义发生了改变 fro
  • sessionStorage什么时候失效

    最近在调试程序的时候无意间看到 cookie 的过期时间是 session 这个 session 表示的是什么时候过期 牵扯出来另一个存储方案 sessionStorage 存储的数据又是什么时候过期呢 在查找相关资料的时候总会看到会话结束
  • SpringCloudAlibaba负载均衡器-Ribbbon

    SpringCloudAlibaba负载均衡器 Ribbon 文章目录 SpringCloudAlibaba负载均衡器 Ribbon 1 什么是Ribbon 1 1 客户端的负载均衡 1 2服务端的负载均衡 1 3 常见的负载均衡算法 2
  • 【合天网安】SQLi-Labs系列之字符型报错注入

    SQL注入介绍 SQLi sql injection 我们称之为sql注入 何为sql 英文 Structured Query Language 叫做结构化查询语言 常见的结构化数据库有MySQL MS SQL Oracle以及Postgr
  • IDEA中快速搜索Jar包里面的内容

    版权声明 本文为CSDN博主 IT model 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net IT model article details 888
  • vue3中引入全局的less 和配置代理

    使用vue cli搭建的项目 在项目中引入公共less变量 创建vue config js 内容如下 use strict const path require path const proxyUrlPort http xxxx modul
  • Failed to start mysqld.service: Unit not found

    很多人对本博客的方法提出了质疑 在此我解释一下 由于MySQL在CentOS7中收费了 所以已经不支持MySQL了 取而代之在CentOS7内部集成了mariadb 而安装MySQL的话会和MariaDB的文件冲突 所以本文建议直接安装ma
  • C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

    在C 系统应用毕设U盘防御软件中需要实现文件不可恢复的删除 首先需要实现类似于资源管理器的界面 通过TreeView控件显示 我的电脑 所有磁盘文件树状目录并加载相应图标 显示结果如下图所示 一 界面设计 主窗体是一个Windowss窗体文