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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM