【问题标题】:C# - Get Parent of ToolStripMenuItemC# - 获取 ToolStripMenuItem 的父级
【发布时间】:2010-12-31 23:45:49
【问题描述】:

如何确定 ToolStripMenuItem 的父级?对于普通的 MenuStrip,您所要做的就是使用 Parent 属性,但 ToolStripMenuItem 似乎没有该属性。我有一个 ToolStripDropDownButton,它有几个 ToolStripMenuItems,我希望能够以编程方式查明它们的父级。

【问题讨论】:

  • ToolStripMenuItem class 公开了一个OwnerOwnerItemParent 属性。这些没有对你有用吗?很难理解您要完成什么以及为什么它不起作用。
  • @Hans,这不是重复的问题,而是更精确的问题,可以找到问题的根源。这个问题让我一无所获,即使你试图回答它也没有成功,然后又删除了你的答案。
  • 我同意,我不认为这个问题是完全重复的。这就是为什么我没有投票关闭它。我认为对方并没有真正触及您遇到的问题的核心,这就是为什么人们很难回答和您找到解决方案的原因。我的问题与我在上面作为评论发布的问题仍然相同 - 您是否尝试过这 3 个属性中的每一个,并发现它们没有一个适合您?我无法想象你不能让他们中的任何一个做你想做的事。您能否更新您的问题以澄清您遇到的问题?
  • 如果将它们构建为一个单一的菜单结构(即添加到 DropDownItems 属性),OwnerItem 是找到“父级”的正确方法,您可以“遍历”层次结构回到顶层 MenuStrip/ContextMenu。但是,如果您创建多个 ContextMenuStrip,然后将 DropDown 属性设置为这些条,理论上您可以在多个位置重复使用相同的条……因此可以有多个路径可以到达同一个项目。 :(

标签: c# winforms


【解决方案1】:

试试OwnerItem 属性。

【讨论】:

  • 正如对该问题的评论......这仅适用于作为单个单元构建的菜单。将 DropDown 属性设置为另一个 ContextMenu 会“破坏”层次结构,即您只能走到设置的 ContextMenu。
  • 当我创建了一个 ContextMenuStrip 并向其中添加了一些 ToolStripMenuItem 项时,我发现在处理某个项的 Click 事件时,OwnerItem 属性为空,但 Owner 属性正确引用了 ContextMenuStrip。因此,请注意哪些适用于您的特定应用程序。
  • 它非常适用于生成的主菜单栏项。谢谢分享!
【解决方案2】:

这对我有用:

ToolStripMenuItem menuItem = sender as ToolStripMenuItem;

ToolStrip toolStrip = menuItem.GetCurrentParent();

...由此,您可以设计一种方法将您从随机 ToolStripMenuItem 带到最顶层,例如:

public static class ToolStripItemExtension
{
    public static ContextMenuStrip GetContextMenuStrip(this ToolStripItem item)
    {
        ToolStripItem itemCheck = item;            

        while (!(itemCheck.GetCurrentParent() is ContextMenuStrip) && itemCheck.GetCurrentParent() is ToolStripDropDown)
        {
            itemCheck = (itemCheck.GetCurrentParent() as ToolStripDropDown).OwnerItem;
        }

        return itemCheck.GetCurrentParent() as ContextMenuStrip;
    }
}

【讨论】:

    【解决方案3】:

    试试这个.....

    ToolStripMenuItem t = (ToolStripMenuItem)sender;
    ContextMenuStrip s = (ContextMenuStrip)t.Owner;
    MessageBox.Show(s.SourceControl.Name);
    

    【讨论】:

      【解决方案4】:

      这就是你要找的东西

      private void ContextMenuStrip_Opening(object sender, CancelEventArgs e)
      {
          contextMenuStrip1.Tag = ((ContextMenuStrip)sender).OwnerItem;
      }
      private void ToolStripMenuItem_Click(object sender, EventArgs e)
      {
          ToolStripMenuItem senderItem = (ToolStripMenuItem)sender;
          var ownerItem = (ToolStripMenuItem)((ContextMenuStrip)senderItem.Owner).Tag;
      }
      

      【讨论】:

        【解决方案5】:

        在搜索了很多关于这个问题的帖子后,我发现这对我有用:

        ToolStripMenuItem mi = (ToolStripMenuItem)sender;
        ToolStripMenuItem miOwnerItem = (ToolStripMenuItem)(mi.GetCurrentParent() as ToolStripDropDown).OwnerItem;
        

        【讨论】:

          猜你喜欢
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 2014-01-25
          • 1970-01-01
          • 2012-10-15
          • 1970-01-01
          • 2015-05-09
          相关资源
          最近更新 更多