我有一个ContextMenuStrip,分配给了几个不同的列表框.我在试着找出当点击ContextMenuStrip的时候,它是在什么ListBox上使用的.我试着从下面的代码开始,但它不起作用.sender具有正确的值,但是当我try 将其赋给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;
                }
            }
        }

推荐答案

For a ContextMenu:

问题在于,sender参数指向的是被点击的上下文菜单上的item,而不是上下文菜单本身.

不过,这是一个简单的修复,因 for each 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;
    }
}

For a ContextMenuStrip:

如果你用ContextMenuStrip而不是ContextMenu,情况会有轻微变化.这两个控件彼此不相关,不能将一个控件的实例强制转换为另一个控件的实例.

与之前一样,被点击的item仍然会在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;
        }
     }
 }

.net相关问答推荐

.NET 7.0中的UseHttpsRedirection和IIS生产部署

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

为什么 ULong > 16 位的数学会变得不稳定?

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

单线程单元 - 无法实例化 ActiveX 控件

调整小数精度,.net

是否可以像 WebView 一样在 Windows 窗体中嵌入 Gecko 或 Webkit?

如何明智地使用 StringBuilder?

IEnumerable Count() 和 Length 的区别

如何判断一个类型是否是简单类型?即持有一个单一的价值

LINQ 性能常见问题解答

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

从 .NET 中的字符串末尾修剪字符串 - 为什么会丢失?

在 .NET 中计算目录大小的最佳方法是什么?

使用语句与最终try

SqlBulkCopy 的推荐批量大小是多少?

根据条件从列表中删除项目

如何在不使用 3rd 方库的情况下登录 C#?

实体框架太慢了.我有哪些 Select ?