在前面講述過使用TreeView控件和ListView控件顯示磁盤目錄信息,但僅僅是顯示信息是不夠的,我們還需要具體的操作.在"個人電腦使用歷史痕跡"項目中我還需要添加"打開文件"和“刪除文件”兩種方法.具體如下:
在第一篇文章"C# 系統應用之TreeView控件 (一).顯示樹狀磁盤文件目錄及加載圖標"中顯示如下:
http://blog.csdn.net/eastmount/article/details/19453107
在第二篇文章"C# 系統應用之ListView控件 (二).加載選中節點文件夾下文件信息"中顯示加載文件信息,如下圖所示:http://blog.csdn.net/eastmount/article/details/21241313
該文章第三篇主要講述的是為ListView控件中顯示的文件添加一個鼠標右鍵菜單欄"打開文件"和"刪除文件",打開文件能打開具體的文件,刪除文件能刪除至回收站.效果圖如下圖所示:
打開文件
刪除文件
一.添加控件ContextMenuStrip
首先添加一個ContextMenuStrip控件(右鍵關聯控件顯示相關菜單),並在"請在此處鍵入"處添加"打開文件"和"刪除文件"兩欄,將添加兩項的Name設置為openFileToolStripMenuItem和deleteFileToolStripMenuItem.(否則為中英名)
然後為filesList(ListView)控件添加鼠標事件,添加代碼如下:
#region 鼠標右擊事件 添加contextMenuStrip控件 private void filesList_MouseClick(object sender, MouseEventArgs e) { //禁止多選 filesList.MultiSelect = false; //鼠標右鍵 if (e.Button == MouseButtons.Right) { //filesList.ContextMenuStrip = contextMenuStrip1; //選中列表中數據才顯示 空白處不顯示 String fileName = filesList.SelectedItems[0].Text; //獲取選中文件名 Point p = new Point(e.X, e.Y); contextMenuStrip1.Show(filesList, p); } } #endregion
此時,運行軟件點擊文件就會添加了相應的菜單欄.
二.打開文件
現在需要添加打開文件功能.需要自定義兩個全局變量記錄打開文件的路徑和名稱.
//全局變量 public string fileNamePublic = ""; //文件名 public string filePathPublic = ""; //文件路徑
在更改選定內容AfterSelect事件中為選中的路徑賦值,同時為openFileToolStripMenuItem添加Click事件.具體代碼如下:
#region 打開文件操作 //設置contextMenuStrip1控件中"打開文件"Name為openFile private void openFileToolStripMenuItem_Click(object sender, EventArgs e) { //文件沒有選中 if (this.filesList.SelectedItems.Count == 0) return; //獲取選中文件 var selectedItem = this.filesList.SelectedItems[0]; //全局變量文件名 SubItems[1]表示文件名 fileNamePublic = filePathPublic + "\\" + selectedItem.SubItems[1].Text; //MessageBox.Show(fileNamePublic); try { //實例化一個新的Process類 命名空間using System.Diagnostics; using (Process p = new Process()) { p.StartInfo.FileName = fileNamePublic; //指定要啟動的文件路徑 p.StartInfo.CreateNoWindow = false; //在當前窗口啟動程序 //指定窗口的顯示樣式 p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; p.StartInfo.UseShellExecute = true; //使用操作系統的shell啟動進程 p.Start(); //開始打開文件 } } catch (Exception msg) //異常處理 { MessageBox.Show(msg.Message); } } #endregion
它是通過實例化一個Process進程類,指定ProcessStartInfo參數,調用Process的Start()方法執行打開文件.
三.刪除文件
刪除文件開始准備的方法是使用File.Delete刪除,但是刪除的文件並不是添加至回收站的,同時系統文件不能訪問.所以采用了SHFileOperation外殼函數實現文件操作.為deleteFileToolStripMenuItem添加Click事件,具體代碼如下:
#region 刪除文件 //刪除文件 //文件刪除到回收站中 private const int FO_DELETE = 3; //刪除 private const int FOF_SILENT = 0x0004; //不顯示進度條提示框 private const int FOF_NOCONFIRMATION = 0x0010; //不出現任何對話框 private const int FOF_ALLOWUNDO = 0x0040; //允許撤銷 private const int FOF_NOCONFIRMMKDIR = 0x0200; //創建文件夾的時候不用確認 //添加命名空間using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] private struct SHFILEOPSTRUCT { public int hwnd; //父窗口句柄,0為桌面 public int wFunc; //功能標志 FO_COPY復制 FO_DELETE刪除 FO_MOVE移動 FO_RENAME重命名 public string pFrom; //source file源文件或者源文件夾 public string pTo; //destination目的文件或文件夾 public int fFlags; //控制文件的標志位 FOF_ALLOWUNDO 准許撤銷 FOF_CONFIRMMOUSE 沒有被使用 public bool fAnyOperationsAborted; public int hNameMappings; public string lpszProgressTitle; } //SHFileOperation外殼函數 實現文件操作 參數SHFILEOPSTRUCT結構 [DllImport("shell32.dll")] private static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); ////// 刪除文件 Delete("c:\\test.txt",true) 把"c:/test.text"刪除到回收箱 /// /// /// private static int Delete(string sPath, bool recycle) { SHFILEOPSTRUCT FileOp = new SHFILEOPSTRUCT(); FileOp.hwnd = 0; FileOp.wFunc = FO_DELETE; //實現操作是刪除文件 FileOp.fFlags = 0; FileOp.fFlags = FileOp.fFlags | FOF_SILENT; FileOp.fFlags = FileOp.fFlags | FOF_NOCONFIRMATION; FileOp.fFlags = FileOp.fFlags | FOF_NOCONFIRMMKDIR; if (recycle) { FileOp.fFlags = FileOp.fFlags | FOF_ALLOWUNDO; } FileOp.pFrom = sPath + "\0"; return SHFileOperation(ref FileOp); } //設置contextMenuStrip1控件中"刪除文件"Name為deleteFile private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) { //文件沒有選中 if (this.filesList.SelectedItems.Count == 0) return; //獲取選中文件 var selectedItem = this.filesList.SelectedItems[0]; //全局變量文件名 SubItems[1]表示文件名 fileNamePublic = filePathPublic + "\\" + selectedItem.SubItems[1].Text; //MessageBox.Show(fileNamePublic); try { if (MessageBox.Show("確認要刪除該最近浏覽文件信息?", "提示", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { //刪除文件 Delete(fileNamePublic, true); //移除文件 foreach (ListViewItem item in this.filesList.SelectedItems) { this.filesList.Items.Remove(item); } } MessageBox.Show(this, "成功刪除了文件!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception msg) //異常處理 { MessageBox.Show(msg.Message); } } #endregion
四.總結
最後,希望該文章對大家有所幫助.這三篇文章主要講述了如何使用C#的TreeView控件加載磁盤目錄信息,同時在ListView控件中顯示具體信息,為ListView控件添加鼠標右鍵ContextMenuStrip控件菜單欄.在這幾篇文章中你可以實現到項目中的:
1.如何使用TreeView控件添加圖標,添加節點及其展開事件
2.如何使用ListView控件加載數據,設置標題頭、添加數據、listItem.SubItems.Add等,尤其在數據庫處理等操作或顯示信息時,經常會應用到該控件顯示內容
3.如何為控件添加右鍵菜單欄ContextMenuStrip,並設置其Item,為其添加相應的響應事件
最後,希望文章對大家有所幫助,如果文章中有錯誤或不足之處,還請海涵.我這系列文章最後的運行效果如下圖所示,高仿360同時能實現各種功能,具體參照博客每部分:
上面的打開刪除文件源代碼地址:http://download.csdn.net/detail/eastmount/7414709
(By:Eastmount 2014-5-28 夜8點 原創CSDNhttp://blog.csdn.net/eastmount/)