vb.netwinformsdatagridviewcontextmenustripheader-row

Different ContextMenuStrip for DataGridView Cell, RowHeader and ColumnHeader


I want to set different ContextMenuStrip for DataGridView Cells, RowHeaders and ColumnHeaders.

The idea is that when I right-click any of these items, a different ContextMenuStrip is displayed. How do I do this?


Solution

  • Use the DataGridView's MouseDown event to test if the right mouse has been clicked and if so use the associated HitTestInfo property to determine if a cell, row or column has been clicked. Use this information to display the ContextMenuStrip you need.

    Here's an example MouseDown event that does this. To try the sample drop a DataGridView and three ContentMenuStrips on a form. Name the ContentMenuStrips mnuCell, mnuRow and mnuColumn.

    Private Sub DataGridView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Right Then
            Dim ht As DataGridView.HitTestInfo
            ht = Me.DataGridView1.HitTest(e.X, e.Y)
            If ht.Type = DataGridViewHitTestType.Cell Then
                DataGridView1.ContextMenuStrip = mnuCell
                mnuCell.Items(0).Text = String.Format("This is the cell at {0}, {1}", ht.ColumnIndex, ht.RowIndex)
            ElseIf ht.Type = DataGridViewHitTestType.RowHeader Then
                DataGridView1.ContextMenuStrip = mnuRow
                mnuRow.Items(0).Text = "This is row " + ht.RowIndex.ToString()
            ElseIf ht.Type = DataGridViewHitTestType.ColumnHeader Then
                DataGridView1.ContextMenuStrip = mnuColumn 
                mnuColumn.Items(0).Text = "This is col " + ht.ColumnIndex.ToString()
            End If
        End If
    End Sub
    

    Here I'm assigning the DataGridView's ContextMenuStrip property to the ContextMenuStrip appropriate for the item right clicked (cell, row or column). To demonstrate how you might further customize the behavior of the ContextMenuStrips I'm also setting the text in each ContentMenuStrips' menu item.