【问题标题】:Context menu items and subitems上下文菜单项和子项
【发布时间】:2011-11-09 01:22:41
【问题描述】:

我在表单中有一个 ContextMenuStrip。

出于某种原因,我想同时更改上下文菜单的所有项目。所以我写了这段代码:

int a = 0; 

foreach (ToolStripItem co in contextMenuStrip1.Items)  
{     
 co.Text = "Menu" + a.ToString();
  a++;
  }

但是虽然主要项目成功改变,但子项目没有改变 那么我怎样才能访问这些子项呢?

PS:我无法添加图片,因为我是这个论坛的新手,所以我希望你明白我的意思。

谢谢!

【问题讨论】:

  • 你需要一个递归函数。
  • 我不明白......你有一个上下文菜单,你可以用鼠标右键打开,或者你有一个工具栏,通常位于窗口的上部?因为您使用了 2 个不同的术语。
  • 将图像托管在某个位置并在此处获取它的链接。
  • @dowhilefor - 快速搜索ContextMenuStrip 会在MSDN 上找到它,它的祖先类型之一是ToolStrip。我在这篇文章的任何地方都没有看到 ToolBar

标签: c# winforms


【解决方案1】:

您需要强制转换为 ToolStripDropDownItem 并检查 DropDownItems 属性。当然,递归地更新它。

这里是示例:

public void ChangeMenuItemsNames(ToolStripItemCollection collection)
    {
        foreach (ToolStripMenuItem item in collection)
        {
            item.Name = "New Name";

            if (item is ToolStripDropDownItem)
            {
                ToolStripDropDownItem dropDownItem = (ToolStripDropDownItem)item;

                if (dropDownItem.DropDownItems.Count > 0)
                {
                    this.ChangeMenuItemsNames(dropDownItem.DropDownItems);
                }
            }
        }
    }

使用方法:

   this.ChangeMenuItemsNames(this.contextMenuStrip1.Items);

【讨论】:

  • 感谢您的回答,看来它正在工作,让我工作一段时间,然后我会再次发布反馈。
  • 是的,它成功了,非常感谢,我在使用 ToolStrip 时遇到了一些问题,但我正在努力解决。当我再次陷入困境时,我会回复。
【解决方案2】:

由于根据 MSDN,ToolStripButton、ToolStripLabel、ToolStripSeparator、ToolStripControlHost、ToolStripDropDownItem、ToolStripStatusLabel 确实继承自 ToolStripItem,因此您可以尝试使用 as 运算符进行转换,然后也设置其 text 属性。

希望这是您的要求。

【讨论】:

  • 我会详细告诉你:我想在运行时更改语言(文化)。除 ContextMenuStrip、MenuStrip 和 ToolStrip 外,所有控件都更改了它们的名称。我也找到了一种方法来更改这三个的名称,但只更改主要项目,而不是子项目。
  • 所有带有子项目的项目都是 ToolStripDropDownItem。查看我的答案。
  • 是的 samich 正在谈论我所做的更多事情!
  • foreach (ToolStripItem co in contextMenuStrip1.Items) //menu.Items) { string text = resourcesss.GetString(co.Name + ".Text", cult); if (text != null) { co.Text = text;我怎样才能重写这段代码来访问 ToolStripDropDownItem 呢?
  • (co as ToolStripDropDownItem).DropDownItems 将获取您的子项目。然后对其进行调试以查看其获取的项目。正如 Samich 所说,递归迭代。
【解决方案3】:
  void ChangeName(ToolStripItemCollection collection, ref int a)
    {
        foreach (ToolStripItem co in collection)
        {
            co.Text = "Menu" + a.ToString();
            a++;
            if (co is ToolStripDropDownItem)
            {
                ToolStripDropDownItem ts = co as ToolStripDropDownItem;
                if (ts.DropDownItems != null) ChangeName(ts.DropDownItems, ref a);
            }
        }
    }

【讨论】:

  • 没有 co.Items =) 我亲身想过,但这只是一个错误的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多