确定使用ContextMenuStrip的控件

Tar*_*ryn 81 .net c# contextmenustrip winforms

我有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

使用下面的帮助,我发现了:

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;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 114

对于ContextMenu:

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

不过,这是一个简单的修复,因为每个都会MenuItem公开一个GetContextMenu方法,告诉你哪个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于ContextMenuStrip:

如果使用a ContextMenuStrip而不是a,它确实会略微改变ContextMenu.这两个控件彼此不相关,并且一个实例不能被转换为另一个的实例.

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

像这样修改你的代码:

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;
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

  • @bluefeet:我已经更新了答案中的代码。`ContextMenu` 和 `ContextMenuStrip` 之间有很大的不同。(啊,我看你已经想通了。嗯,最好是自己学习!) (2认同)
  • 我使用 Opening 事件将打开菜单的 SourceControl 记录到本地变量,然后在处理项目单击时引用该变量。 (2认同)

Nic*_*lan 5

我很难让任何这些代码工作。这是我能找到的最简单的解决方案:

对于 ContextMenuStrip:

    Control _sourceControl = null;
    private void contextMenuStrip_Opened(object sender, EventArgs e)
    {
        _sourceControl = contextMenuStrip.SourceControl;
    }

    private void contextMenuItem_Click(object sender, EventArgs e)
    {
        var menuItem = (ToolStripMenuItem)sender;

        _sourceControl.Text = menuItem.Text;
        MessageBox.Show(menuItem.Name);
        MessageBox.Show(sourceControl.Name);
    }
Run Code Online (Sandbox Code Playgroud)