2013-07-29 63 views
1

總之我的問題是如何落實「發送到」(右鍵單擊在Windows文件)C# - 動態添加和刪除的ContextMenuStrip項和「智能事件」

我有一個數據網格視圖也包含一個帶日誌文件名的列(我知道每個文件的路徑)

我想添加到我的彈出式菜單將選項複製到桌面和磁盤上的鑰匙(可移動)驅動程序。

我的彈出菜單可能是這樣的:

View log 

    Open file location 

    <----------------> 

    Copy to --> Desktop 
       (and Removable Drivers) 

    ... 

所以我想:

  1. 與「桌面」和所有的可移動驅動器添加列表「複製到」子下菜單(並刪除用戶彈出它們的可移動驅動程序)

  2. 正如我所說我想將文件複製到可移動驅動程序,所以如何添加「動態事件」 - 我的意思 - 如果用戶插入4 Disk On Key驅動程序我在「複製到」子菜單(比方說桌面和E:\,F:\,G:\,L :)下有新的4行,因此我需要每個可移動驅動程序的新點擊事件將文件複製到真正的動力......

關於問題1 - 我發現,檢測是否在電腦可移動驅動器插頭和我成功的removalble驅動程序添加到子菜單中的代碼。但我沒有成功從子菜單中刪除項目:

private void menu_PopUp_Opening(object sender, CancelEventArgs e) 
{ 
    // Need to remove all removable drivers first --> How to do ? 

    // to update the USB drivers when opening new pop up menu 
    DriveInfo[] ListDrives = DriveInfo.GetDrives(); 
    foreach (DriveInfo Drive in ListDrives) 
    { 
     if (Drive.DriveType == DriveType.Removable) 
     { 
      // add to popup menu, from: http://stackoverflow.com/questions/5868446/how-to-add-sub-menu-items-in-contextmenustrip-using-c4-0 
      (menu_PopUp.Items[3] as ToolStripMenuItem).DropDownItems.Add(Drive.Name + " (" + Drive.VolumeLabel + ")"); 
     } 
    } 
} 

謝謝任何​​幫助!

+0

每個上下文菜單中打開你應該刪除下的所有項目時間複製到項目,然後重建列表。這樣的項目是最新的。命令:contextMenu.Items.Remove(item); – andrewb

+0

謝謝,但我怎麼知道我有多少物品(在「複製到」子菜單中)? – AsfK

+0

@AsfK你可能想要考慮'DriveInfo'來尋找'Removable drives'。 –

回答

2

爲什麼不只是明確刪除除頂層外的一個所有菜單子項,即「桌面」:

... 
    // Need to remove all removable drivers first 
    ToolStripMenuItem copyToItem = menu_PopUp.Items[3] as ToolStripMenuItem; 

    // Assuming that "Desktop" menu item is the top one, 
    // we should delete all the items except #0 
    for (int i = copyToItem.DropDownItems.Count - 1; i >= 1; --i) 
    copyToItem.DropDownItems.RemoveAt(i); 

    ... 
    // to update the USB drivers when opening new pop up menu 
    DriveInfo[] ListDrives = DriveInfo.GetDrives(); 

    foreach (DriveInfo Drive in ListDrives) { 
    if (Drive.DriveType == DriveType.Removable) { 
     // add to popup menu, from: http://stackoverflow.com/questions/5868446/how-to-add-sub-menu-items-in-contextmenustrip-using-c4-0 
     ToolStripItem item = (menu_PopUp.Items[3] as ToolStripMenuItem).DropDownItems.Add(Drive.Name + " (" + Drive.VolumeLabel + ")"); 

     item.Tag = Drive.Name; // <- bind (via tag) driver name with menu item 
     item.Click += OnRemovableDriveClick; 
    } 
    } 

... 

    private void OnRemovableDriveClick(object sender, EventArgs e) { 
    ToolStripItem item = sender as ToolStripItem; 

    String driveName = item.Tag as String; 
    ... 
+0

謝謝,但我如何檢測用戶單擊每個可移動驅動器? – AsfK

+1

AsfK:看我的編輯 –

+0

真的謝謝! – AsfK

0
  1. 獲取參照 「複製到」 項目
  2. 循環通過該項目的項目

    ToolStripMenuItem copyToItem = menuStrip.Item(...)

    的foreach(在copyToItem ToolStripMenuItem項目。 Items) { copyToItem.Items.Remove(item); }

+0

謝謝,它真的解決了第一個問題,但我仍然需要知道如何檢測用戶點擊每個可移動驅動器 – AsfK

+0

請參閱我上面的評論 - 我提供了一個SO問題的鏈接。基本上在你的代碼中添加了每個驅動器類型:menuItem.Click + =和Visual Studio將建議併爲該菜單項創建一個單擊事件。或者,您可以創建一個事件處理程序,並將其分配給menuItem.Click – andrewb