程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 系統應用之ListView控件 (三).添加ContextMenuStrip右鍵菜單打開文件和刪除文件功能

C# 系統應用之ListView控件 (三).添加ContextMenuStrip右鍵菜單打開文件和刪除文件功能

編輯:C#入門知識

在前面講述過使用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/)


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved