2014-05-19 37 views
0

這類似於:How to add things to a menustrip programatically?,但我需要稍微不同的東西。將菜單添加到menustrip c#並指定它們的代碼

我有一個winform,我正在創建窗體的新實例。但是,當我製作新窗體時,我還收集了當前窗體的所有實例,並使用菜單項填充「窗口」菜單以允許關閉窗口。因此,我不僅需要以編程方式將菜單添加到菜單欄中,還需要指定這些菜單的功能。那可能嗎?

代碼:

private void newWindowToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     var newForm = new Form1(); 
     newForm.Show(); 
     foreach (Form form in Application.OpenForms) 
     { 

      // add menu items under "Window" with the name of the window and the 
      // event handler to close that window, aka form.Close() I assume; 
     } 
    } 

我想這樣來做,這樣我每次我創建一個新的窗口時間更新「窗口」菜單,使我的窗戶,關閉的名單是準確的,沒有任何奇怪的額外的東西。

回答

0

添加「ItemClicked」 -event您ContexMenuStrip菜單。 「ContextMenuStrip1」是此處使用的菜單的名稱。你的代碼編輯部分內容如下:

 var newForm = new Form1() { Name = "myForm" }; 
     newForm.Show(); 

     foreach (Form form in Application.OpenForms) 
     { 
      // Add new menuitem with the name of the form, and save the reference to "Tag"-property 
      ToolStripMenuItem newItem = new ToolStripMenuItem() { Name = newForm.Name, Text = newForm.Name, Tag = newForm }; 

      // Add the new item to the menu 
      contextMenuStrip1.Items.Add(newItem); 
     } 

然後使「ItemClicked」 -event:

private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 

     // Close the linked form, if it isn't disposed 
     if (!((Form)((ToolStripItem)e.ClickedItem).Tag).IsDisposed) 
     { 
      ((Form)((ToolStripItem)e.ClickedItem).Tag).Close(); 
     } 

     // Remove this menuitem from the menu 
     contextMenuStrip1.Items.Remove((ToolStripItem)e.ClickedItem); 
    } 
0

您可以創建一個包含必填字段的類,並傳遞所需的數據。

public class MenuItemInfo 
{ 
    public string Text { get; set; } 
    public object Tag { get; set; } 
    public EventHandler Handler { get; set; } 
} 

var menuItems = new List<MenuItemInfo> 
{ 
    new MenuItemInfo 
    { 
     Text = "whatever", 
     Tag = whatever, 
     Handler = (o, s) => 
     { 
      //Do whatever 
     } 
    } 
}; 

ToolStripMenuItem toolStripMenuItem; 
foreach (var mi in menuItems) 
{ 
    ToolStripMenuItem foo = new ToolStripMenuItem(mi.Text); 
    foo.Click += mi.Handler; 
    foo.Tag = mi.Tag; 

    toolStripMenuItem.DropDownItems.Add(foo); 
} 
+0

這看起來確實不錯,但我令人頭大我的腦子試圖找出如何我我要去實現它,因爲我試圖在現有的事件處理器中執行它: 'code' private void newWindowToolStripMenuItem_Click(object sender,EventArgs e) { var newForm = new Form1(); newForm.Show(); foreach(Application.OpenForms中的表單形式) { //添加帶有代碼的menuitems以關閉其中一個打開的窗口,替換現有的菜單項。 } }'code' –

+0

很抱歉,我不明白。你解決了你的問題,或者你需要更多的幫助?如果您需要更多幫助,請使用更多信息編輯您的問題,更新代碼等。 –

相關問題