How to display a context menu in the center of the CurrentCell or selected cells in WinForms GridControl?
Context menu
The context menu appears at the Grid with respect to the current pixel position of the Grid. When you right-click on a Grid, it pops up with the current pixel position as the starting point. To display the context menu at the center of the cell/Range of selected cells refer to the following solution.
Solution
You can display the context menu at the center of the current cell or selected cells by handling the Grid's MouseDown event. In the event handler, the center location of the current cell or the selected range is calculated by using the GridUtil.CenterPoint and the context menu is displayed after moving the cursor to the center point.
this.gridControl1.MouseDown += gridControl1_MouseDown;
void gridControl1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
GridCurrentCell cc = this.gridControl1.CurrentCell;
// To retrieve mouse position
Point pt = new Point(e.X, e.Y);
// Selecting more than one Cell
if (this.gridControl1.Selections.Ranges.Count > 0)
{
//Get the center point from the selected range.
pt = GridUtil.CenterPoint(this.gridControl1.RangeInfoToRectangle(this.gridControl1.Selections.Ranges.ActiveRange));
Cursor.Position = this.gridControl1.PointToScreen(pt);
}
// Single Cell
else if (cc.HasCurrentCell)
{
pt = GridUtil.CenterPoint(this.gridControl1.RangeInfoToRectangle(cc.RangeInfo));
Cursor.Position = this.gridControl1.PointToScreen(pt);
}
// To Show ContextMenu
this.contextMenu1.Show(this.gridControl1, pt);
}
}AddHandler Me.gridControl1.MouseDown, AddressOf gridControl1_MouseDown
Private Sub gridControl1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
If e.Button = MouseButtons.Right Then
Dim cc As GridCurrentCell = Me.gridControl1.CurrentCell
' To retrieve mouse position
Dim pt As New Point(e.X, e.Y)
' Selecting more than one Cell
If Me.gridControl1.Selections.Ranges.Count > 0 Then
'Get the center point from the selected range.
pt = GridUtil.CenterPoint(Me.gridControl1.RangeInfoToRectangle(Me.gridControl1.Selections.Ranges.ActiveRange))
Cursor.Position = Me.gridControl1.PointToScreen(pt)
' Single Cell
ElseIf cc.HasCurrentCell Then
pt = GridUtil.CenterPoint(Me.gridControl1.RangeInfoToRectangle(cc.RangeInfo))
Cursor.Position = Me.gridControl1.PointToScreen(pt)
End If
' To Show ContextMenu
Me.contextMenu1.Show(Me.gridControl1, pt)
End If
End SubNote:
When you right-click on the Grid control, the context menu is shown.

Figure 1: Context menu in the center position of the current cell

Figure 2: Context menu in the center position of the selected range of cells
Samples: