将ToolStripMenuItems动态添加到MenuStrip(C#/Winforms)
我已经实现了我的解决方案(基本解决方案),我很高兴 问题是,当我使用“add”方法向ToolStripItemCollection添加新项时,会出现一些重载。。。有意义的参数是字符串参数、图像参数和EventHandler参数 因为我的下拉列表在运行时将作为动态历史,这意味着在编译时它将是空的。这意味着我不能通过使用设计器图面(单击)的标准路径添加事件处理程序。我被迫使用上述过载 I映像对我没有用处,但动态添加事件处理程序是我感兴趣并需要帮助的 网址: 没有其他过载来帮助我,所以我必须使用图像。。。任何人都有办法绕过这个问题,并告诉我如何完全满足这个重载版本的add方法 蒂亚将ToolStripMenuItems动态添加到MenuStrip(C#/Winforms),c#,winforms,menuitem,C#,Winforms,Menuitem,我已经实现了我的解决方案(基本解决方案),我很高兴 问题是,当我使用“add”方法向ToolStripItemCollection添加新项时,会出现一些重载。。。有意义的参数是字符串参数、图像参数和EventHandler参数 因为我的下拉列表在运行时将作为动态历史,这意味着在编译时它将是空的。这意味着我不能通过使用设计器图面(单击)的标准路径添加事件处理程序。我被迫使用上述过载 I映像对我没有用处,但动态添加事件处理程序是我感兴趣并需要帮助的 网址: 没有其他过载来帮助我,所以我必须使用图像。
更新:我在当前项目中再次这样做,但使用了更流畅的代码,但原则是相同的,在运行时动态添加事件处理程序。回家后,我会用一些示例代码更新它。我的方法是创建一个
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)我从你的回复中得到了一些线索,并且工作得很好。现在,在我进入下一个重要章节之前,我需要为我的应用程序做的最后一件事是想出一个方法,重新调整我的历史记录菜单,允许添加一个新项目,其余的项目向上移动。这应该是简单的enuff,因为我已经测试过了,到目前为止一切都很好。嗯,如果BuildMenuItems的调用超过once@jk它不仅会在多次调用时泄漏,而且会多次触发事件。在代码开头取消订阅项[i]。单击-=新建事件处理程序(MenuItemClickHandler);myMenu.DropDownItems.Remove(items[i]);当然,其他需要的错误处理检查也应该在那里,但这是jist。Dunno mate,我相对缺乏经验,但感谢JasonH,我能够使用以下内容。这真的没什么错,我更热衷于使用其中一个重载作为上述解决方案的姿势。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。historyToolStripMenuItem.DropDownItems.Add(treeDrives.SelectedNode.FullPath,null,新事件处理程序(MenuItemClickHandler));这正是我想要的。。。并且工作得很漂亮。您可以看到,我正在使用FullPath属性为该项指定一个有意义的名称,因为它与已启动的文件相关,为null,因为我没有在末尾使用任何图像和事件处理程序。这是我一直在挣扎的超负荷。。。现在看起来很简单=)。如果您想知道这会将最近执行的文件附加到“历史记录”菜单中,并从菜单中以快捷方式重新启动它们^^。