I have two click events of menu items in a context menu strip.
I can get the source control of the clicked context menu item by doing this code:
Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;
Screenshot of the context menu item
But when I use this code on a context menu item that is in another level it returns null.
Screenshot of the context menu item in another level
How can I get the sourcecontrol in the click event of the second screenshot's menu item?
The ContextMenuStrip SourceControl (the reference of the current Control where the Context Menu is activated) can be retrieved, from a ToolStripMenuItem, inspecting the OwnerItem reference and moving upstream until the OwnerItem
reference is null
, then inspecting the Owner value, which references the ContextMenuStrip
.
(Unfortunately, the SourceControl
reference is only available in the ContextMenuStrip
control).
A simple alternative method is using a Field
that references the Control
where the current ContextMenuStrip
has been activated (you can have just one active ContextMenuStrip
).
This Field reference, set when the ContextMenuStrip
is opened - by subscribing to the Opened()
event - can then be accessed by any of the ToolStripMenuItem
.
The Field reference is then set back to null
when then ContextMenuStrip
is closed.
An example:
(toolStripMenuItem
is a generic name, it must be set to an actual control name).
Control CurrentContextMenuOwner = null;
private void contextMenuStrip1_Opened(object sender, EventArgs e)
{
CurrentContextMenuOwner = (sender as ContextMenuStrip).SourceControl;
}
private void toolStripMenuItem_Click(object sender, EventArgs e)
{
CurrentContextMenuOwner.BackColor = Color.Blue;
//(...)
}
private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
CurrentContextMenuOwner = null;
}