Skip to main content
All docs
V17.2

Creating Custom Context Menus

  • 3 minutes to read

The Grid Control allows you to create custom context menus for any grid element (row indicator panel, data cells, etc.). This topic shows how this can be done.

For general information on popup menus, see Popup Menus Overview.

Example: Creating Custom Context Menus

This example creates a custom context menu for the header panel button. This menu has two items: Columns and Runtime Column Customization. The first item is a sub menu that allows you to show/hide available grid columns. The second item invokes the Customization Form.

Creating Custom Context Menus

The following code defines the custom menu specified by the GridViewColumnButtonMenu class. Elements in this menu are encapsulated by DXMenuItem objects (and their descendants).


using DevExpress.Utils;
using DevExpress.Utils.Menu;
using DevExpress.XtraGrid.Menu;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;

public class GridViewColumnButtonMenu : GridViewMenu {
   public GridViewColumnButtonMenu(DevExpress.XtraGrid.Views.Grid.GridView view) : base(view) { }
   // Create menu items.
   // This method is automatically called by the menu's public Init method.
   protected override void CreateItems() {
      Items.Clear();
      DXSubMenuItem columnsItem = new DXSubMenuItem("Columns");
      Items.Add(columnsItem);
      Items.Add(CreateMenuItem("Runtime Column Customization", GridMenuImages.Column.Images[3], 
        "Customization", true));
      foreach(GridColumn column in View.Columns) {
         if(column.OptionsColumn.ShowInCustomizationForm)
            columnsItem.Items.Add(CreateMenuCheckItem(column.Caption, column.VisibleIndex >= 0, 
              null, column, true));
      }
   }
   protected override void OnMenuItemClick(object sender, EventArgs e) {
      if(RaiseClickEvent(sender, null)) return;
      DXMenuItem item = sender as DXMenuItem;
      if(item.Tag == null) return;
      if(item.Tag is GridColumn) {
         GridColumn column = item.Tag as GridColumn;
         column.VisibleIndex = column.VisibleIndex >= 0 ? -1 : View.VisibleColumns.Count;
      }
      else if(item.Tag.ToString() == "Customization") View.ShowCustomization(); 
   }
}

The following code shows how to invoke the custom menu on right-clicking the Grid View.


private void gridView1_MouseDown(object sender, MouseEventArgs e) {
    GridView view = sender as GridView;
    // Check if the right mouse button has been pressed
    if (e.Button == MouseButtons.Right)
        DoShowMenu(view.CalcHitInfo(new Point(e.X, e.Y)));
}


void DoShowMenu(DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi) {
   // Create the menu.
   DevExpress.XtraGrid.Menu.GridViewMenu menu = null;
   // Check whether the header panel button has been clicked.
   if(hi.HitTest == DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.ColumnButton) {
      menu = new GridViewColumnButtonMenu(hi.View);
      menu.Init(hi);
      // Display the menu.
      menu.Show(hi.HitPoint);
   }
}

The image below shows the result.

Creating Custom Context Menus

See Also