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.
C#
//In Form_Load 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); } }
VB
'In Form_Load Me.gridControl1.MouseDown += 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 Sub
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: