19

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

问题是当我使用“添加”方法将新项目添加到 ToolStripItemCollection 时,我得到了一些重载……有意义的重载是字符串参数、图像参数和 EventHandler 参数。

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

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

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

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

TIA。

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

4

4 回答 4

37

我这样做的方法是创建一个数组ToolStripMenuItems并用我正在添加的项目填充该数组。我创建了一种方法来处理点击事件,并让它检查我在运行时创建的每个项目的独特之处。Name您可以尝试使用Tag每个ToolStripMenuItem. 然后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
}
于 2009-11-18T17:19:55.177 回答
1

出什么问题了:

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

我错过了什么吗?

于 2009-11-19T20:41:05.807 回答
0

我和菲利普华莱士有类似的问题。请务必注意 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
于 2013-03-28T22:53:19.510 回答
0

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

Menu.DropDownItems.Add(Text, null, EventHandler);
于 2016-11-15T16:23:54.147 回答