2011-11-29 83 views
2

我有一個包含帶有許多抽頭頁面的選項卡面板的表單。他們每個人都有自己的上下文菜單(右鍵單擊顯示)。但如果我添加一個ToolStripMenuItem到多個ContextMenuStrips,只有最後一個菜單條纔有這個菜單項。 簡單的代碼示例:ToolStripMenuItem for multiple ContextMenuStrip

ToolStripMenuItem tim_refresh = new ToolStripMenuItem("Refresh", null, (o, e) => 
     { 
      MessageBox.Show("Refresh"); 
     }); 

    ContextMenuStrip cms1 = new ContextMenuStrip(); 
    cms1.Items.Add(tim_refresh); 

    ContextMenuStrip cms2 = new ContextMenuStrip(); 
    cms2.Items.Add(tim_refresh); 

    this.tblDataManagerObjects.ContextMenuStrip = cms1; 
    this.tblDataSourceTypes.ContextMenuStrip = cms2; 

如果一個顯示此菜單,一個接一個,首先將是空的......我如何能實現我想要什麼?

回答

0

這是因爲視覺不能同時是多個不同視覺的孩子。在你的情況tim_refresh同時是cms1cms2的孩子。

您需要創建兩個完全獨立的ToolStripMenuItem實例。

編輯:

可以在因子方法提取視覺創建簡化多個對象實例化:

private ToolStripMenuItem CreateToolStripMenuItem(string name) 
{ 
    return new ToolStripMenuItem(name, null, (o, e) => 
     { 
      MessageBox.Show(name); 
     }); 
} 

// then just call it once per each menu strip 
ContextMenuStrip cms1 = new ContextMenuStrip(); 
cms1.Items.Add(CreateToolStripMenuItem("Refresh")); 

ContextMenuStrip cms2 = new ContextMenuStrip(); 
cms2.Items.Add(CreateToolStripMenuItem("Refresh")); 
+0

嗯,有沒有簡單的方法來做一個菜單項的多個副本? – Vasya

+0

克隆它,看到我的SO帖子DeepCopy來源[是否有更好的方式來創建C#中深和淺的克隆](http://stackoverflow.com/a/8025905/485076)。因此,您需要在項目中複製MemoryUtils類,然後爲您的soluwion中的任何對象調用DeepCopy()方法(它是擴展方法,我相信您知道它是什麼) – sll

+0

ToolStripItem未標記爲可序列化。( – Vasya

0

一次一個顯示一次上下文菜單;您可能不需要遍佈各地的許多克隆,但您可能希望在菜單條打開時將菜單項的一個實例移動到菜單條上;

當本地副本爲空時,我將名爲(grand)父項的項目移動到子項(當前打開)菜單中,並且所有下一個ctx開口我只是AddRange,它移動「定位」的三個菜單項從以前打開的ctxMenuStrip到當前打開的一個:

// http://stackoverflow.com/questions/8307959/toolstripmenuitem-for-multiple-contextmenustrip?rq=1 
    // http://stackoverflow.com/questions/6275120/toolstripmenuitem-added-to-several-places?rq=1 
    // WILL_ADD_PARENT_MENU_ITEMS_IN_Opening first time opened we locate common menu items from GrandParent, then we move them to the current slider; cool? 
    private static ToolStripItem[] separatorLoadSave = null; 
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { 
     if (separatorLoadSave == null) { 
      separatorLoadSave = new ToolStripItem[3]; 

      Control slidersAutoGrow = base.Parent; 
      if (base.Parent.Name != "SlidersAutoGrow") return; 
      Control slidersForm = slidersAutoGrow.Parent; 
      if (slidersForm.Name != "SlidersForm") return; 

      ToolStripItem[] separator = slidersForm.ContextMenuStrip.Items.Find("toolStripSeparator1", false); 
      if (separator.Length > 0) separatorLoadSave[0] = separator[0]; 

      ToolStripItem[] load = slidersForm.ContextMenuStrip.Items.Find("mniParameterSetLoad", false); 
      if (load.Length > 0) separatorLoadSave[1] = load[0]; 

      ToolStripItem[] save = slidersForm.ContextMenuStrip.Items.Find("mniParameterSetSave", false); 
      if (save.Length > 0) separatorLoadSave[2] = save[0]; 
     } 

     this.contextMenuStrip1.SuspendLayout(); 
     this.contextMenuStrip1.Items.AddRange(separatorLoadSave); 
     this.contextMenuStrip1.ResumeLayout(); 
    }