Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将内容添加到menustrip c#并指定其代码_C#_Winforms_Visual Studio 2013 - Fatal编程技术网

将内容添加到menustrip c#并指定其代码

将内容添加到menustrip c#并指定其代码,c#,winforms,visual-studio-2013,C#,Winforms,Visual Studio 2013,这类似于:,但我需要稍微不同的东西 我有一个winform,我正在创建表单的新实例。然而,当我创建一个新的表单时,我也会收集表单的所有当前实例,并用菜单项填充“窗口”菜单,以允许我关闭窗口。因此,我不仅需要以编程方式向菜单条添加内容,还需要指定这些菜单的功能。可能吗 代码: 我想这样做,这样每次创建新窗口时我都会更新“窗口”菜单,以便关闭的窗口列表准确无误。您可以创建一个包含必需字段的类,并传递必需的数据 public class MenuItemInfo { public string

这类似于:,但我需要稍微不同的东西

我有一个winform,我正在创建表单的新实例。然而,当我创建一个新的表单时,我也会收集表单的所有当前实例,并用菜单项填充“窗口”菜单,以允许我关闭窗口。因此,我不仅需要以编程方式向菜单条添加内容,还需要指定这些菜单的功能。可能吗

代码:


我想这样做,这样每次创建新窗口时我都会更新“窗口”菜单,以便关闭的窗口列表准确无误。

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

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);
}
公共类菜单信息
{
公共字符串文本{get;set;}
公共对象标记{get;set;}
公共事件处理程序{get;set;}
}
var menuItems=新列表
{
新MenuItemInfo
{
Text=“无论如何”,
Tag=随便什么,
处理程序=(o,s)=>
{
//做任何事
}
}
};
ToolStripMenuItem ToolStripMenuItem;
foreach(菜单项中的var mi)
{
ToolStripMenuItem foo=新的ToolStripMenuItem(mi.Text);
foo.Click+=mi.Handler;
foo.Tag=mi.Tag;
toolStripMenuItem.DropDownItems.Add(foo);
}
将“ItemClicked”-事件添加到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”-事件:

    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);
    }

这看起来非常好,但我正在绞尽脑汁想如何实现它,因为我正试图在现有的eventhandler中实现它:
code
private void newWindowToolStripMenuItem\u Click(object sender,EventArgs e){var newForm=newform1();newForm.Show();foreach(Application.OpenForms中的表单){//add menuitems with code关闭一个打开的窗口,替换现有的menuitems.}
code
对不起,我不明白。你解决了你的问题还是需要更多的帮助?如果您需要更多帮助,请使用更多信息、更新的代码等编辑您的问题。
    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);
    }