33 votes

Déterminez le contrôle utilisé par ContextMenuStrip

J'ai un ContextMenuStrip qui est affectée à plusieurs zones de liste. Je suis à essayer de comprendre lorsque l' ContextMenuStrip est cliqué sur ce qu' ListBox elle a été utilisée. J'ai essayé le code ci-dessous comme un point de départ mais il ne fonctionne pas. L' sender a la bonne valeur, mais quand j'essaie d'assigner à l' menuSubmitted il est nul.

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

Toute aide serait super. Merci.

À l'aide de l'assistance ci-dessous, j'ai tout compris:

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

58voto

Cody Gray Points 102261

Pour un ContextMenu:

Le problème est que l' sender paramètre indique l' élément dans le menu contextuel qui a été cliqué, pas le menu contextuel lui-même.

C'est une solution simple, car chaque MenuItem expose GetContextMenu méthode qui vous indiquera ContextMenu contient cet élément de menu.

Changer votre code de la manière suivante:

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

Pour un ContextMenuStrip:

Il change un peu les choses si vous utilisez un ContextMenuStrip au lieu de ContextMenu. Les deux contrôles ne sont pas liés l'un à l'autre, et d'une instance de l'une ne peut être utilisé à une instance de l'autre.

Comme avant, l' élément qui a été cliqué est toujours retourné dans l' sender de paramètre, de sorte que vous aurez à déterminer l' ContextMenuStrip qui détient cette option de menu. Vous faites cela avec l' Owner de la propriété. Enfin, vous allez utiliser l' SourceControl de la propriété afin de déterminer qui contrôle l'affichage du menu contextuel.

Modifier votre code comme suit:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X