【问题标题】:How to access items inside sub menu item in C# windows form application in ToolStripMenuItems?如何在 ToolStripMenuItems 的 C# windows 窗体应用程序中访问子菜单项内的项目?
【发布时间】:2018-01-13 02:59:54
【问题描述】:

在我的 Windows 窗体应用程序中有一个 toolstripmenuitem。 我需要访问每个子菜单项并检查是否有特定的菜单项名称可用,如果找到该项目,我想禁用它。 例如:

     Report
         |__Stock
         |     |__Stock Balance
         |     |__Stock Reorder
         |__Sales
               |__Summary

我的代码是这样的。根据我的代码,我可以访问子菜单(股票)并禁用它。但我无法访问子菜单中的子项目(库存余额)。

String specificMenuItemName = "Stock Balance";

                    foreach (ToolStripMenuItem menuItem in MainMenuStrip.Items)
                    {
                        if (menuItem != null)
                        {
                            if (menuItem.HasDropDownItems)
                            {
                                foreach (ToolStripItem subMenuItem in menuItem.DropDownItems)
                                {
                                    if (subMenuItem is ToolStripSeparator)
                                    { }
                                    else
                                    {
                                        if (specificMenuItemName == subMenuItem.Text)
                                        {
                                            subMenuItem.Enabled = false;
                                        }
                                    }
                                }
                            }
                        }
                    }

我如何访问Stock Balance并禁用它?

【问题讨论】:

    标签: c# winforms menu submenu toolstripmenu


    【解决方案1】:

    如果递归函数遍历每个具有下拉项目的项目,直到找到具有指定名称的项目,它会怎样?像这样的东西(快速而肮脏,跳过检查分隔符和类似的东西......):

    private static void DisableItem(ToolStripDropDownItem menu, bool enable, string text)
    {
        if (!menu.HasDropDownItems)
            if (Equals(menu.Text, text))
                menu.Enabled = enable;
            else
                return;
    
        foreach(var subItem in menu.DropDownItems)
        {
            var item = subItem as ToolStripDropDownItem;
            if (item == null) continue; 
    
            if (item.HasDropDownItems)
                DisableItem(item, enable, text);
            if (Equals(item.Text, text))
                item.Enabled = enable;
        }
    }
    

    【讨论】:

    • @Mr.Michael,您的回答对我很有帮助。它运作良好。但是现在我在使用 ToolStripSeparator 时遇到了问题。 ToolStripSeparator 在 ToolStripItem 下。我收到一个错误,“无法将'System.Windows.Forms.ToolStripSeparator'类型的对象转换为'System.Windows.Forms.ToolStripMenuItem'。”您可以修改您的答案以检查和避免 ToolStripSeparator 吗?
    • @KasunPerera 我已经更改了我的代码。更改了菜单参数的类型并在循环内添加了强制转换/类型检查...ToolStripDropDownItem 是具有.DropDownItems 属性的类,因此我们可以忽略没有此属性的每个菜单项。如果您的菜单中有组合框或文本框,它们也会被忽略...
    • @Mr.Michael,我可以使用您的最终建议解决我的问题。非常感谢。非常感谢您的贡献。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多