| |
 |
How to: Implement Custom Menu in XtraGrid Control
The following example shows how to use the GridView.PopupMenuShowing event to create a custom menu in the Data Grid control. The created menu is displayed when you right-click within a data row or group row. It contains a 'Rows' submenu with a single "Delete this row" regular button, and a 'Cell Merging' check button.

A click on the 'Delete this row' button invokes the ColumnView.DeleteRow method. The 'Cell Merging' check button toggles the GridOptionsView.AllowCellMerge option.
C# |
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.Utils.Menu;
using DevExpress.XtraEditors;
private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) {
GridView view = sender as GridView;
if (e.MenuType == DevExpress.XtraGrid.Views.Grid.GridMenuType.Row) {
int rowHandle = e.HitInfo.RowHandle;
e.Menu.Items.Clear();
e.Menu.Items.Add(CreateSubMenuRows(view, rowHandle));
DXMenuItem item = CreateMenuItemCellMerging(view, rowHandle);
item.BeginGroup = true;
e.Menu.Items.Add(item);
}
}
DXMenuItem CreateSubMenuRows(GridView view, int rowHandle) {
DXSubMenuItem subMenu = new DXSubMenuItem("Rows");
string deleteRowsCommandCaption;
if (view.IsGroupRow(rowHandle))
deleteRowsCommandCaption = "&Delete rows in this group";
else
deleteRowsCommandCaption = "&Delete this row";
DXMenuItem menuItemDeleteRow = new DXMenuItem(deleteRowsCommandCaption, new EventHandler(OnDeleteRowClick), imageCollection1.Images[0]);
menuItemDeleteRow.Tag = new RowInfo(view, rowHandle);
menuItemDeleteRow.Enabled = view.IsDataRow(rowHandle) || view.IsGroupRow(rowHandle);
subMenu.Items.Add(menuItemDeleteRow);
return subMenu;
}
DXMenuCheckItem CreateMenuItemCellMerging(GridView view, int rowHandle) {
DXMenuCheckItem checkItem = new DXMenuCheckItem("Cell &Merging",
view.OptionsView.AllowCellMerge, null, new EventHandler(OnCellMergingClick));
checkItem.Tag = new RowInfo(view, rowHandle);
checkItem.ImageOptions.Image = imageCollection1.Images[1];
return checkItem;
}
void OnDeleteRowClick(object sender, EventArgs e) {
DXMenuItem menuItem = sender as DXMenuItem;
RowInfo ri = menuItem.Tag as RowInfo;
if (ri != null) {
string message = menuItem.Caption.Replace("&", "");
if (XtraMessageBox.Show(message + " ?", "Confirm operation", MessageBoxButtons.YesNo) != DialogResult.Yes)
return;
ri.View.DeleteRow(ri.RowHandle);
}
}
void OnCellMergingClick(object sender, EventArgs e) {
DXMenuCheckItem item = sender as DXMenuCheckItem;
RowInfo info = item.Tag as RowInfo;
info.View.OptionsView.AllowCellMerge = item.Checked;
}
class RowInfo {
public RowInfo(GridView view, int rowHandle) {
this.RowHandle = rowHandle;
this.View = view;
}
public GridView View;
public int RowHandle;
}
|
VB |
Imports DevExpress.Utils.Menu
Imports DevExpress.XtraEditors
Imports DevExpress.XtraGrid.Views.Grid
Private Sub GridView1_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) Handles GridView1.PopupMenuShowing
Dim view As GridView = TryCast(sender, GridView)
If e.MenuType = GridMenuType.Row Then
Dim rowHandle As Integer = e.HitInfo.RowHandle
e.Menu.Items.Clear()
e.Menu.Items.Add(CreateSubMenuRows(view, rowHandle))
Dim item As DXMenuItem = CreateMenuItemCellMerging(view, rowHandle)
item.BeginGroup = True
e.Menu.Items.Add(item)
End If
End Sub
Private Function CreateSubMenuRows(ByVal view As GridView, ByVal rowHandle As Integer) As DXMenuItem
Dim subMenu As DXSubMenuItem = New DXSubMenuItem("Rows")
Dim deleteRowsCommandCaption As String
If view.IsGroupRow(rowHandle) Then
deleteRowsCommandCaption = "&Delete rows in this group"
Else
deleteRowsCommandCaption = "&Delete this row"
End If
Dim menuItemDeleteRow As DXMenuItem = New DXMenuItem(deleteRowsCommandCaption, New EventHandler(AddressOf OnDeleteRowClick), ImageCollection1.Images(0))
menuItemDeleteRow.Tag = New RowInfo(view, rowHandle)
menuItemDeleteRow.Enabled = view.IsDataRow(rowHandle) OrElse view.IsGroupRow(rowHandle)
subMenu.Items.Add(menuItemDeleteRow)
Return subMenu
End Function
Private Function CreateMenuItemCellMerging(ByVal view As GridView, ByVal rowHandle As Integer) As DXMenuCheckItem
Dim checkItem As DXMenuCheckItem = New DXMenuCheckItem("Cell &Merging", view.OptionsView.AllowCellMerge, Nothing, New EventHandler(AddressOf OnCellMergingClick))
checkItem.Tag = New RowInfo(view, rowHandle)
checkItem.ImageOptions.Image = ImageCollection1.Images(1)
Return checkItem
End Function
Private Sub OnDeleteRowClick(ByVal sender As Object, ByVal e As EventArgs)
Dim menuItem As DXMenuItem = TryCast(sender, DXMenuItem)
Dim ri As RowInfo = TryCast(menuItem.Tag, RowInfo)
If ri IsNot Nothing Then
Dim message As String = menuItem.Caption.Replace("&", "")
If XtraMessageBox.Show(message & " ?", "Confirm operation", MessageBoxButtons.YesNo) <> DialogResult.Yes Then Return
ri.View.DeleteRow(ri.RowHandle)
End If
End Sub
Private Sub OnCellMergingClick(ByVal sender As Object, ByVal e As EventArgs)
Dim item As DXMenuCheckItem = TryCast(sender, DXMenuCheckItem)
Dim info As RowInfo = TryCast(item.Tag, RowInfo)
info.View.OptionsView.AllowCellMerge = item.Checked
End Sub
Class RowInfo
Public Sub New(ByVal view As GridView, ByVal rowHandle As Integer)
Me.RowHandle = rowHandle
Me.View = view
End Sub
Public View As GridView
Public RowHandle As Integer
End Class
|
Is this topic helpful?
Additional Feedback
Close
|