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

时间:2009-11-18 17:12:46

标签: c# winforms menuitem

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

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

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

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

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

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

TIA。

更新:我在当前项目中再次执行此操作但使用更多更流畅的代码但原理相同,在运行时动态添加事件处理程序。我回家后会用一些示例代码更新。

4 个答案:

答案 0 :(得分:33)

我这样做的方法是创建一个ToolStripMenuItems数组,并用我正在添加的项填充该数组。我创建了一个方法来处理click事件,并让它检查我在运行时创建的每个项目的独特之处。您可以尝试使用每个Name的{​​{1}}或Tag属性。然后在您要添加的菜单中使用ToolStripMenuItem。所以你的代码看起来像这样:

AddRange

答案 1 :(得分:1)

有什么问题:

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

我错过了什么吗?

答案 2 :(得分:0)

我和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

答案 3 :(得分:0)

您只需为图像传递null即可。

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