将菜单添加到menustrip c#并指定它们的代码

问题描述:

这类似于: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; 
     } 
    } 

我想这样来做,这样我每次我创建一个新的窗口时间更新“窗口”菜单,使我的窗户,关闭的名单是准确的,没有任何奇怪的额外的东西。

添加“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); 
    } 

您可以创建一个包含必填字段的类,并传递所需的数据。

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

很抱歉,我不明白。你解决了你的问题,或者你需要更多的帮助?如果您需要更多帮助,请使用更多信息编辑您的问题,更新代码等。 –