确定 ContextMenuStrip 用于哪个控件 [英] Determine what control the ContextMenuStrip was used on

查看:32
本文介绍了确定 ContextMenuStrip 用于哪个控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a ContextMenuStrip that is assigned to several different listboxes. I am trying to figure out when the ContextMenuStrip is clicked what ListBox it was used on. I tried the code below as a start but it is not working. The sender has the correct value, but when I try to assign it to the menuSubmitted it is null.

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

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

Any help would be great. Thanks.

使用下面的帮助,我想通了:

Using the assistance below, I figured it out:

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 参数指向被点击的上下文菜单上的item,而不是上下文菜单本身.

For a ContextMenu:

The problem is that the sender parameter points to the item on the context menu that was clicked, not the context menu itself.

不过,这是一个简单的修复,因为每个 MenuItem 公开一个 GetContextMenu 方法,它会告诉您哪个 ContextMenu 包含该菜单项.

It's a simple fix, though, because each MenuItem exposes a GetContextMenu method that will tell you which ContextMenu contains that menu item.

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

Change your code to the following:

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,它确实会稍微改变一些事情.这两个控件彼此不相关,一个的实例不能转换为另一个的实例.

For a ContextMenuStrip:

It does change things slightly if you use a ContextMenuStrip instead of a ContextMenu. The two controls are not related to one another, and an instance of one cannot be casted to an instance of the other.

和以前一样,被点击的 item 仍然在 sender 参数中返回,所以你必须确定拥有的 ContextMenuStrip这个单独的菜单项.您可以通过 所有者属性.最后,您将使用 SourceControl 属性 以确定哪个控件正在显示上下文菜单.

As before, the item that was clicked is still returned in the sender parameter, so you will have to determine the ContextMenuStrip that owns this individual menu item. You do that with the Owner property. Finally, you'll use the SourceControl property to determine which control is displaying the context menu.

像这样修改你的代码:

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

这篇关于确定 ContextMenuStrip 用于哪个控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆