C# – DataGridView Right Click Specific Column for ContextMenuStrip

cdatagridviewwinforms

With C# I am trying to only show a ContextMenuStrip (CMS) when I right click a specific column in my DataGridView. I am confused as to whether I should be using a DataGridView_CellContentClick and/or dataGridView1.HitTest(). Then to finish off my problem I want to send the data from that right clicked cell to a new form window.

My current code has strange behavior. It will not show the CMS unless I have first left click or right clicked the 4th column. However once I have it will always show the CMS on a right click.

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 4)
        {
            //Create the ContextStripMenu for Creating the PO Sub Form
            ContextMenuStrip Menu = new ContextMenuStrip();
            ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
            //Assign event handlers
            MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
            Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
            //Assign created context menu strip to the Datagrid
            dataGridView1.ContextMenuStrip = Menu;
        }
    }

    void MenuOpenPO_Click(object sender, MouseEventArgs e)
    {
        var ht = dataGridView1.HitTest(e.X, e.Y);

               MessageBox.Show("Hello2");
               PO_Form POWindow = new PO_Form();
               POWindow.Show();
    }

I was going to use the var ht = dataGridView1.HitTest(e.X, e.Y); to grab the cell value.

Any help would be appreciated, thanks!

Edit 1
So I updated dataGridView1_CellContentClick to this and it gets me very close to the behaviour I am looking for. If I first left click in column 4 then right click I get my CMS. If I left click any other cell in another column then right click the CMS is no longer there. However I want to be able to just right click a cell in column 4 without having to left click first to create the CMS.

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 4)
        {
            //MessageBox.Show("Hello1");
            //Create the ContextStripMenu for Creating the PO Sub Form
            ContextMenuStrip Menu = new ContextMenuStrip();
            ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Open PO");
            //Assign event handlers
            MenuOpenPO.MouseUp += new MouseEventHandler(MenuOpenPO_Click);
            Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
            //Assign created context menu strip to the Datagrid
            dataGridView1.ContextMenuStrip = Menu;
        }

        else
            dataGridView1.ContextMenuStrip = null;
    }

Best Answer

I did this in VB ..

Private Sub DGV_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick
    If e.Button = Windows.Forms.MouseButtons.Right Then

        DGV.CurrentCell = DGV.Rows(e.RowIndex).Cells(e.ColumnIndex)

        CMS.Show(DGV, DGV.PointToClient(Windows.Forms.Cursor.Position))

    End If
End Sub