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

问题描述 投票:0回答:5

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

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

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

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

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

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

TIA。

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

c# winforms menuitem
5个回答
40
投票

我的方法是创建一个

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
}

1
投票

有什么问题:

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

我错过了什么吗?


1
投票

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

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

0
投票

我也遇到了与菲利普·华莱士类似的问题。请务必注意 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

0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.