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

简介:

在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/)

 

目录
相关文章
|
SQL 数据库 数据安全/隐私保护
C#wpf学习卡后台管理系统
C#wpf学习卡后台管理系统
424 32
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
403 3
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
736 0
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
668 9
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
497 2
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
660 1
|
存储 分布式计算 监控
C# 创建一个分布式文件存储系统需要怎么设计??
C# 创建一个分布式文件存储系统需要怎么设计??
357 0
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
503 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
527 3