将ToolStripMenuItems动态添加到MenuStrip(C#/Winforms)

将ToolStripMenuItems动态添加到MenuStrip(C#/Winforms),c#,winforms,menuitem,C#,Winforms,Menuitem,我已经实现了我的解决方案(基本解决方案),我很高兴 问题是,当我使用“add”方法向ToolStripItemCollection添加新项时,会出现一些重载。。。有意义的参数是字符串参数、图像参数和EventHandler参数 因为我的下拉列表在运行时将作为动态历史,这意味着在编译时它将是空的。这意味着我不能通过使用设计器图面(单击)的标准路径添加事件处理程序。我被迫使用上述过载 I映像对我没有用处,但动态添加事件处理程序是我感兴趣并需要帮助的 网址: 没有其他过载来帮助我,所以我必须使用图像。

我已经实现了我的解决方案(基本解决方案),我很高兴

问题是,当我使用“add”方法向ToolStripItemCollection添加新项时,会出现一些重载。。。有意义的参数是字符串参数、图像参数和EventHandler参数

因为我的下拉列表在运行时将作为动态历史,这意味着在编译时它将是空的。这意味着我不能通过使用设计器图面(单击)的标准路径添加事件处理程序。我被迫使用上述过载

I映像对我没有用处,但动态添加事件处理程序是我感兴趣并需要帮助的

网址:

没有其他过载来帮助我,所以我必须使用图像。。。任何人都有办法绕过这个问题,并告诉我如何完全满足这个重载版本的add方法

蒂亚


更新:我在当前项目中再次这样做,但使用了更流畅的代码,但原则是相同的,在运行时动态添加事件处理程序。回家后,我会用一些示例代码更新它。

我的方法是创建一个
ToolStripMenuItems
数组,并用我添加的项填充该数组。我创建了一个方法来处理单击事件,并让它检查我在运行时创建的每个项目的唯一性。您可以尝试使用每个
ToolStripMenuItem
Name
Tag
属性。然后在要添加到的菜单中当场使用
AddRange
。因此,您的代码可能如下所示:

private void BuildMenuItems()
{
    ToolStripMenuItem[] items = new ToolStripMenuItem[2]; // You would obviously calculate this value at runtime
    for (int i = 0; i < items.Length; i++)
    {
        items[i] = new ToolStripMenuItem();
        items[i].Name = "dynamicItem" + i.ToString();
        items[i].Tag = "specialDataHere";
        items[i].Text = "Visible Menu Text Here";    
        items[i].Click += new EventHandler(MenuItemClickHandler);
    }

    myMenu.DropDownItems.AddRange(items);
}

private void MenuItemClickHandler(object sender, EventArgs e)
{
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
    // Take some action based on the data in clickedItem
}
private void BuildMenuItems()
{
ToolStripMenuItem[]items=new ToolStripMenuItem[2];//您显然会在运行时计算此值
对于(int i=0;i
有什么问题:

ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);

我遗漏了什么吗?

我和菲利普·华莱士有类似的问题。注意ToolStripItem和ToolStripMenuItem之间的区别很重要。我将ToolStripItems添加到ToolStripMenuItem的DropDownItems中,它们会显示出来,并且所有属性都设置正确,并且可以在代码中访问,但是它们不会显示任何文本!切换到ToolStripMenuItem解决了这个问题

关于最初的问题,我一直在使用空构造函数,并设置所需的字段。(我在vb.net中使用.net 4.0,它不允许我调用
新工具StripMenuItem()
,因为它有
MustInherit
标记,所以我创建了这个类:

Public Class DynamicToolStripMenuItem
    Inherits ToolStripMenuItem

    Public Sub New(value As Integer, text As String, handler As System.EventHandler)
        MyBase.New()
        Me.Text = text
        Me.Visible = True
        Me.Tag = value
        AddHandler Me.Click, handler
    End Sub
End Class

您可以简单地为图像传递null

Menu.DropDownItems.Add(Text, null, EventHandler);

感谢您的回复…这看起来很有希望,尽管我想先尝试一下Add methods重载,如果这里有人能告诉我……=)我是如何保持乐观的,
Add
方法也是这样工作的。不要创建数组,然后使for循环在单个项上工作:
ToolStripMenuItem item=newtoolstripmenuitem()
然后在for循环调用的末尾:
myMenu.Items.Add(item)