C# - 获取 ToolStripMenuItem 的父级元素

16

我怎么确定一个 ToolStripMenuItem 的父级?对于普通的 MenuStrip,只要使用 Parent 属性就可以了,但似乎 ToolStripMenuItem 没有这个属性。我有一个 ToolStripDropDownButton,里面有一些 ToolStripMenuItems,我想在程序中找到它们的父级。


可能是重复的问题:C# - 将MenuStrip代码转换为ToolStrip - Hans Passant
ToolStripMenuItem公开了OwnerOwnerItemParent属性。这些属性都不能满足您的需求吗?很难理解您想要实现什么以及为什么它不起作用。 - Cody Gray
@Hans,这不是重复问题,而是更精确的问题,以便找到问题的根源。那个问题没有给我带来任何进展,即使你也试图回答它,但没有成功,然后删除了你的答案。 - user
我同意,我不认为这个问题是一个完全的重复。这就是为什么我没有投票关闭它的原因。我认为其他人并没有真正深入到你遇到的问题核心,这就是为什么对于回答者和你自己找到解决方案都很困难的原因。我的问题仍然与我在评论中发布的那个相同——你是否尝试过这三个属性中的每一个,并发现没有一个适合你?我无法想象你不能使任何一个属性达到你想要的效果。你能否更新一下你的问题,澄清你遇到的问题? - Cody Gray
如果您将它们构建为单个菜单结构一直到底部(即添加到DropDownItems属性),OwnerItem是正确的查找“父项”的方式,您可以“遍历”层次结构回到顶级MenuStrip/ContextMenu。 但是,如果您创建多个ContextMenuStrip,然后将DropDown属性设置为这些条带,您可以在多个位置理论上重复使用相同的条带...因此可能有多个路径可以到达相同的项目。 :( - AndrewD
5个回答

25

7
评论中提到,此方法只适用于以单个单位构建的菜单。将DropDown属性设置为另一个ContextMenu会“破坏”层次结构,也就是说,你只能向上走到设置的ContextMenu。 - AndrewD
当我创建了一个ContextMenuStrip并添加了一些ToolStripMenuItem项时,我发现在处理项目的Click事件时,OwnerItem属性为null,但Owner属性正确引用了ContextMenuStrip。因此,请注意在您特定的应用程序中哪个属性起作用。 - Brad Oestreicher
它对于生成的主菜单栏项目完美运作。谢谢分享! - Goodies

6
这对我有用:
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;
    }
}

4

试试这个……

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

0

这就是你要找的东西

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;
}

0
在搜索了许多关于这个问题的帖子后,我发现以下方法适用于我:
ToolStripMenuItem mi = (ToolStripMenuItem)sender;
ToolStripMenuItem miOwnerItem = (ToolStripMenuItem)(mi.GetCurrentParent() as ToolStripDropDown).OwnerItem;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接