我有一个 ContextMenuStrip 分配给几个不同的列表框。我想弄清楚当 ContextMenuStrip 被点击时,它是在 ListBox 上使用的。我尝试了下面的代码作为开始,但它不起作用。 sender 具有正确的值,但是当我尝试将其分配给 menuSubmitted 时,它为空。

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    ContextMenu menuSubmitted = sender as ContextMenu;
    if (menuSubmitted != null)
    {
        Control sourceControl = menuSubmitted.SourceControl;
    }
}

任何帮助都会很棒。谢谢。

使用下面的帮助,我想通了:
private void MenuViewDetails_Click(object sender, EventArgs e)
        {
            ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
            if (menuItem != null)
            {
                ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;

                if (calendarMenu != null)
                {
                    Control controlSelected = calendarMenu.SourceControl;
                }
            }
        }

最佳答案

对于 ContextMenu :

问题是 sender 参数指向被单击的上下文菜单上的项目,而不是上下文菜单本身。

不过,这是一个简单的修复,因为每个 MenuItem 都会暴露一个 GetContextMenu method,它会告诉您哪个 ContextMenu 包含该菜单项。

将您的代码更改为以下内容:

private void MenuViewDetails_Click(object sender, EventArgs e)
{
    // Try to cast the sender to a MenuItem
    MenuItem menuItem = sender as MenuItem;
    if (menuItem != null)
    {
        // Retrieve the ContextMenu that contains this MenuItem
        ContextMenu menu = menuItem.GetContextMenu();

        // Get the control that is displaying this context menu
        Control sourceControl = menu.SourceControl;
    }
}

对于 ContextMenuStrip :

如果您使用 ContextMenuStrip 而不是 ContextMenu ,它确实会略有改变。这两个控件彼此不相关,一个的实例不能转换为另一个的实例。

和以前一样,被单击的项目仍然在 sender 参数中返回,因此您必须确定拥有该单个菜单项的 ContextMenuStrip。你用 Owner property 做到这一点。最后,您将使用 SourceControl property 来确定哪个控件正在显示上下文菜单。

像这样修改你的代码:
private void MenuViewDetails_Click(object sender, EventArgs e)
{
     // Try to cast the sender to a ToolStripItem
     ToolStripItem menuItem = sender as ToolStripItem;
     if (menuItem != null)
     {
        // Retrieve the ContextMenuStrip that owns this ToolStripItem
        ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
        if (owner != null)
        {
           // Get the control that is displaying this context menu
           Control sourceControl = owner.SourceControl;
        }
     }
 }

关于c# - 确定 ContextMenuStrip 用于哪个控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4886327/

10-17 00:22