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圖標免費資源:https://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加載圖標.那麼怎樣實現閱讀文件夾下文件,獲取其圖標、文件大小、擴展名等信息,並雙擊打開文件呢?下一篇將接著講述.最後希望該文章對大家有所幫助,文章中很多鏈接都可以供覺得有用的同學學習,感謝上麵提到的文章及書籍作者.同時如果文章中有錯誤或不足之處請原諒,有問題或建議者亦可提出.希望尊重作者勞動果實勿噴.
資源下載地址:https://download.csdn.net/detail/eastmount/6937355
想使用C++ MFC實現同樣功能的文章見:https://blog.csdn.net/eastmount/article/details/19120567
(By:Eastmount 2014-2-19 下午3點https://blog.csdn.net/eastmount/)
最後更新:2017-04-03 12:55:09
上一篇:
slidingmenu開源效果
下一篇:
JavaCore extends Plugin
【膚色檢測(II)】Mat版
360告贏傅盛:傅盛微博言論被判對360造成侵權
今年雙十一,和阿裏雲一起,通往智能之路
android ListView中Checkbox實現單選,全選,全不選功能——1
《數據結構與抽象:Java語言描述(原書第4版)》一P.2.2 前置條件和後置條件
《TensorFlow技術解析與實戰》——第2章 TensorFlow環境的準備 2.2基於pip的安裝
如何使用係統設備枚舉器
將點分式的IP地址轉換成長整型
HTAP數據庫 PostgreSQL 場景與性能測試之 16 - (OLTP) 文本特征向量 - 相似特征(海明...)查詢
hi3531的pcie atu資源重映射