我已经实施了我的解决方案(基本解决方案),我很高兴。
问题是,当我使用“Add”方法向 ToolStripItemCollection 添加新项目时,我得到了一些重载……有意义的重载是字符串参数、图像参数和 EventHandler 参数。
因为我的下拉列表将在运行时充当动态历史记录,这意味着它在编译时将为空。这意味着我无法通过使用设计器界面的标准途径(单击时)添加事件处理程序。我被迫使用上面描述的过载。
我的图像对我来说没有用,但动态添加事件处理程序是我感兴趣的并且需要帮助。
URL:http://msdn.microsoft.com/en-us/library/bxdt0s8t.aspx
没有其他重载可以帮助我,所以我必须使用图像...任何人都有任何想法来解决这个问题并向我展示如何完全满足 add 方法的这个重载版本。
TIA。
更新:我在当前项目中再次执行了此操作,但使用了更流畅的代码,但原理是相同的,在运行时动态添加事件处理程序。当我回家时,我会用一些示例代码更新它。
我的方法是创建一个
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
}
有什么问题:
ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);
我错过了什么吗?
您只需为图像传递 null 即可。
Menu.DropDownItems.Add(Text, null, EventHandler);
我也遇到了与菲利普·华莱士类似的问题。请务必注意 ToolStripItem 和 ToolStripMenuItem 之间的区别。我将 ToolStripItems 添加到 ToolStripMenuItem 的 DropDownItems 中,它们会显示出来,并且所有属性设置正确,并且可以在代码中访问,但它们不会显示任何文本!切换到 ToolStripMenuItem 解决了这个问题。
关于最初的问题,我一直在使用空构造函数,并设置我需要的字段。 (我在 vb.net 中使用 .net 4.0,它不会让我调用
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
oMenusSiscon = clsLNUsuario.ObtenerMenu_v2(FrameworkFunctions.USER.Perfil); bool 存在 = oMenusSiscon.AsEnumerable().Where(dr => dr.Field("Menu_Opcion") == 1).Count() > 0; DataTable Despacho = oMenusSiscon.AsEnumerable().Where(x => x.Field("Menu_Opcion") == 1).Select(x => x).CopyToDataTable(); ToolStripMenuItem oMenuItem = new ToolStripMenuItem(); ToolStripMenuItem itemsSub; 如果(存在==真) { DataTable 菜单 = Despacho.AsEnumerable().Where(x => x.Field("Menu_Orden") == 0).Select(x => x).CopyToDataTable(); oMenuItem.Text = Menu.Rows[0][2].ToString(); DataTable SubMenu = Despacho.AsEnumerable().Where(x => x.Field("Menu_Orden") != 0).Select(x => x).CopyToDataTable(); 对于 (int i = 0; i < SubMenu.Rows.Count; i++) { itemsSub = new ToolStripMenuItem(); itemsSub.Name = SubMenu.Rows[i][4].ToString(); itemsSub.Enabled = SubMenu.Rows[i][5].ToString() == "A" ? true : false; itemsSub.Text = SubMenu.Rows[i][3].ToString(); itemsSub.Click += new EventHandler(submenu_selected); oMenuItem.DropDownItems.Add(itemsSub);
}
//myMenu.DropDownItems.AddRange(items);
menuStrip.Items.Add(oMenuItem);