Sanjeev Pundir
Sanjeev Pundir

Reputation: 49

How to get what form control a context menu was over when clicked one of its items

I‘ve one ContextMenuStrip attached to two controls (DataGridView).

In the ToolStripMenuItem click event, currently I’ve used:this.ActiveControl.Name to get the active GridView control name;

This is fine if I first select the GridView cell and than Rt. click on it to invoke the ContextMenu

Case: sometime if GridView control is not a active control and cell is pre-selected, than context menu Item click not worked accordingly.

Is there any way to get the owner name that initiate the context menu Item click event?

Currently, In the ToolStripMenuItem click event, I've manage to get the original caller (i.e. DataGridView) with this code:

private void CopytoolStripMenuItem1_Click(object sender, EventArgs e)        
{
    var grid = new DataGridView();
    switch (this.ActiveControl.Name)
    {
        case "dGVEL1":
        {
            grid=dGVEL1;
            break;
        }
        case "dGVEL2":
        {
            grid=dGVEL2;
            break;
        }
    }
    if (grid == null)  return;
    DataObject data = grid.GetClipboardContent();
    Clipboard.SetDataObject(data);
}

Upvotes: 0

Views: 1077

Answers (2)

CalDevC
CalDevC

Reputation: 1

Is there any way to get the owner name that initiate the context menu Item click event?

I worked off of the solution you found and simplified it down. Hopefully, this can help some future readers who are looking for a more general solution.

It looks like you go through quite a bit to get ahold of the ContextMenuStrip which is already being passed as sender (granted you will still need to cast it). The following is a more general solution to this issue and it's a bit more simple.

private void contextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {
    //Cast the parent as a context menu strip so we can access 'sourceControl' attribute
    ContextMenuStrip strip = (ContextMenuStrip) sender;
    var stripParent = strip.SourceControl;

    //print the name of the 'parent' (Control that called the context menu)
    System.Diagnostics.Debug.WriteLine("Called From: " + stripParent.Name);
}

Upvotes: 0

Sanjeev Pundir
Sanjeev Pundir

Reputation: 49

Finally I've Resolved the issue.. The complete solution is

    private void CopytoolStripMenuItem1_Click(object sender, EventArgs e)        
      {
        ToolStripDropDownItem item = sender as ToolStripDropDownItem;
        if (item == null) // Error
            return;
        ContextMenuStrip strip = item.Owner as ContextMenuStrip;
        var grid = strip.SourceControl as DataGridView;

        if (grid == null) // Control wasn't a DGV
            return;
        switch (grid.Name)
        {
            case "dGVEL1":
            {
                grid=dGVEL1;
                break;
            }
        case "dGVEL2":
            {
                grid=dGVEL2;
                break;
            }
       }
    if (grid == null)  return;
    DataObject data = grid.GetClipboardContent();
    Clipboard.SetDataObject(data);
    }

Upvotes: 2

Related Questions