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

我实施了我的解决方案(基本解决方案),我很高兴。

问题是当我使用’Add’方法向ToolStripItemCollection添加新项时,我得到一些重载……有意义的一个是字符串参数,图像参数和EventHandler参数。

因为我的下拉列表将在RunTime中用作动态历史记录,这意味着它在编译时将变为空。 这意味着我无法通过使用设计器表面的标准路径添加事件处理程序(单击时)。 我被迫使用上述的重载。

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

url: http : //msdn.microsoft.com/en-us/library/bxdt0s8t.aspx

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

TIA。

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

我这样做的方法是创建一个ToolStripMenuItems数组,并用我正在添加的项填充该数组。 我创建了一个方法来处理click事件,并让它检查我在运行时创建的每个项目的独特之处。 您可以尝试使用每个ToolStripMenuItemNameTag属性。 然后在您要添加的菜单中的现场使用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 } 

出什么问题了:

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

我错过了什么吗?

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

关于原始问题,我一直在使用空构造函数,并设置我需要的字段。 (我在.net 4.0的vb.net中,它不会让我调用New ToolStripMenuItem()因为它有一个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);