zoukankan      html  css  js  c++  java
  • 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绑定图标.

     

    二. 代码实现

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

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
     1 /// <summary>  
     2 /// IconIndexs类 对应ImageList中5张图片的序列  
     3 /// </summary>  
     4 private class IconIndexes  
     5 {  
     6     public const int MyComputer = 0;      //我的电脑  
     7     public const int ClosedFolder = 1;    //文件夹关闭  
     8     public const int OpenFolder = 2;      //文件夹打开  
     9     public const int FixedDrive = 3;      //磁盘盘符  
    10     public const int MyDocuments = 4;     //我的文档  
    11 }
      

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

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
     1 /// <summary>  
     2 /// 窗体加载Load事件 初始化  
     3 /// </summary>  
     4 private void Form1_Load(object sender, EventArgs e)  
     5 {  
     6     //实例化TreeNode类 TreeNode(string text,int imageIndex,int selectImageIndex)              
     7     TreeNode rootNode = new TreeNode("我的电脑",  
     8         IconIndexes.MyComputer, IconIndexes.MyComputer);  //载入显示 选择显示  
     9     rootNode.Tag = "我的电脑";                            //树节点数据  
    10     rootNode.Text = "我的电脑";                           //树节点标签内容  
    11     this.directoryTree.Nodes.Add(rootNode);               //树中添加根目录  
    12   
    13     //显示MyDocuments(我的文档)结点  
    14     var myDocuments = Environment.GetFolderPath           //获取计算机我的文档文件夹  
    15         (Environment.SpecialFolder.MyDocuments);  
    16     TreeNode DocNode = new TreeNode(myDocuments);  
    17     DocNode.Tag = "我的文档";                            //设置结点名称  
    18     DocNode.Text = "我的文档";  
    19     DocNode.ImageIndex = IconIndexes.MyDocuments;         //设置获取结点显示图片  
    20     DocNode.SelectedImageIndex = IconIndexes.MyDocuments; //设置选择显示图片  
    21     rootNode.Nodes.Add(DocNode);                          //rootNode目录下加载节点  
    22     DocNode.Nodes.Add("");  
    23   
    24     //循环遍历计算机所有逻辑驱动器名称(盘符)  
    25     foreach (string drive in Environment.GetLogicalDrives())  
    26     {  
    27         //实例化DriveInfo对象 命名空间System.IO  
    28         var dir = new DriveInfo(drive);  
    29         switch (dir.DriveType)           //判断驱动器类型  
    30         {  
    31             case DriveType.Fixed:        //仅取固定磁盘盘符 Removable-U盘   
    32                 {  
    33                     //Split仅获取盘符字母  
    34                     TreeNode tNode = new TreeNode(dir.Name.Split(':')[0]);  
    35                     tNode.Name = dir.Name;  
    36                     tNode.Tag = tNode.Name;  
    37                     tNode.ImageIndex = IconIndexes.FixedDrive;         //获取结点显示图片  
    38                     tNode.SelectedImageIndex = IconIndexes.FixedDrive; //选择显示图片  
    39                     directoryTree.Nodes.Add(tNode);                    //加载驱动节点  
    40                     tNode.Nodes.Add("");                            
    41                 }  
    42                 break;  
    43         }  
    44     }  
    45     rootNode.Expand();                  //展开树状视图  
    46 }  

    代码首先用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图标.

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     1 /// <summary>  
     2 /// 在结点展开后发生 展开子结点  
     3 /// </summary>  
     4 private void directoryTree_AfterExpand(object sender, TreeViewEventArgs e)  
     5 {  
     6     e.Node.Expand();  
     7 }  
     8   
     9 /// <summary>  
    10 /// 在将要展开结点时发生 加载子结点  
    11 /// </summary>  
    12 private void directoryTree_BeforeExpand(object sender, TreeViewCancelEventArgs e)  
    13 {  
    14     TreeViewItems.Add(e.Node);  
    15 }  
    16   
    17 /// <summary>  
    18 /// 自定义类TreeViewItems 调用其Add(TreeNode e)方法加载子目录  
    19 /// </summary>  
    20 public static class TreeViewItems  
    21 {  
    22     public static void Add(TreeNode e)  
    23     {  
    24         //try..catch异常处理  
    25         try  
    26         {  
    27             //判断"我的电脑"Tag 上面加载的该结点没指定其路径  
    28             if (e.Tag.ToString() != "我的电脑")  
    29             {  
    30                 e.Nodes.Clear();                               //清除空节点再加载子节点  
    31                 TreeNode tNode = e;                            //获取选中展开折叠结点  
    32                 string path = tNode.Name;                      //路径    
    33   
    34                 //获取"我的文档"路径  
    35                 if (e.Tag.ToString() == "我的文档")  
    36                 {  
    37                     path = Environment.GetFolderPath           //获取计算机我的文档文件夹  
    38                         (Environment.SpecialFolder.MyDocuments);  
    39                 }  
    40   
    41                 //获取指定目录中的子目录名称并加载结点  
    42                 string[] dics = Directory.GetDirectories(path);  
    43                 foreach (string dic in dics)  
    44                 {  
    45                     TreeNode subNode = new TreeNode(new DirectoryInfo(dic).Name); //实例化  
    46                     subNode.Name = new DirectoryInfo(dic).FullName;               //完整目录  
    47                     subNode.Tag = subNode.Name;  
    48                     subNode.ImageIndex = IconIndexes.ClosedFolder;       //获取节点显示图片  
    49                     subNode.SelectedImageIndex = IconIndexes.OpenFolder; //选择节点显示图片  
    50                     tNode.Nodes.Add(subNode);  
    51                     subNode.Nodes.Add("");                               //加载空节点 实现+号  
    52                 }  
    53             }  
    54         }  
    55         catch (Exception msg)  
    56         {  
    57             MessageBox.Show(msg.Message);                   //异常处理  
    58         }  
    59     }  
    60 }
      

    注意事项:
    (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://blog.csdn.net/eastmount/article/details/19453107
    资源下载地址: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/)

  • 相关阅读:
    elasticsearch + kibana 安装
    JSON Web Token
    JConsole和VisualVM远程访问JMX
    DNS域名解析
    Spring Cloud(2)主要组件应用实例
    Docker(三):Docker入门教程-CentOS Docker 安装
    Spring Cloud(1)相关概念
    Zookeeper实现哨兵机制
    大数据学习笔记之初识Hadoop
    大数据学习笔记之大数据概述
  • 原文地址:https://www.cnblogs.com/oyer/p/4736750.html
Copyright © 2011-2022 走看看