在使用 GridControl 的时候经常需要添加右键菜单一般的做法是自己创建菜单项, 然后注册 GridView 的 Mouse-Click 事件, 然后 Show 出定义好的菜单但是涉及到一些单击事件会收到编辑器编辑状态影响, 所以 Mouse-Click 事件不好用
幸好, GridView 自带了一个默认的右键事件, 专门用于弹出右键菜单用: PopupMenuShowing
为了调用方便, 设计成一个静态方法, 调用的时候只用传入需要注册的网格就好:
GridViewMenuHelper.CreateCopyCellItem(gdvw);
这里, 为传入网格添加一个名为复制 XXX(XXX 为列头) 的方法, 可以将鼠标点中的 Cell 中的数据复制到剪贴板
效果图如下:
实现代码如下:
- #region 添加复制 Cell 菜单
- public static void CreateCopyCellItem(GridView View)
- {
- View.PopupMenuShowing += new PopupMenuShowingEventHandler(Create_CopyCellItem);
- }
- static void Create_CopyCellItem(object sender, PopupMenuShowingEventArgs e)
- {
- if (e.MenuType == DevExpress.XtraGrid.Views.Grid.GridMenuType.Row)
- {
- if (e.HitInfo.InRowCell)
- {
- e.Menu.Items.Add(CreateCopyMenuItem((GridView)sender, e.HitInfo.RowHandle, e.HitInfo.Column));
- }
- }
- }
- static DXMenuItem CreateCopyMenuItem(GridView view, int rowHandle, GridColumn column)
- {
- DXMenuItem copyitem = new DXMenuItem("复制" + column.Caption,
- new EventHandler(OnCopyCellClick), null);
- copyitem.Tag = column;
- return copyitem;
- }
- static void OnCopyCellClick(object sender, EventArgs e)
- {
- GridColumn col = (GridColumn)((DXMenuItem)sender).Tag;
- string filed = col.FieldName;
- Clipboard.SetDataObject(col.View.GetRowCellDisplayText(col.View.FocusedRowHandle, col), true);
- }
- #endregion
补充:
- public class GridViewAddPopupMenuBase
- {
- EventHandler OnClearCellClick;
- string MenuName;
- public static void CreateNewCellItem(GridView View, string cMenuName, EventHandler DoClearCellClick)
- {
- GridViewAddPopupMenuBase gb = new GridViewAddPopupMenuBase();
- gb.OnClearCellClick = DoClearCellClick;
- gb.MenuName = cMenuName;
- View.PopupMenuShowing += new PopupMenuShowingEventHandler(gb.Create_NewCellItem);
- }
- void Create_NewCellItem(object sender, PopupMenuShowingEventArgs e)
- {
- if (e.MenuType == DevExpress.XtraGrid.Views.Grid.GridMenuType.Row)
- {
- if (((GridView)sender).OptionsBehavior.Editable == true)
- {
- if (e.HitInfo.InRowCell && e.HitInfo.Column.OptionsColumn.AllowEdit == true)
- {
- e.Menu.Items.Add(CreateNewMenuItem((GridView)sender, e.HitInfo.RowHandle, e.HitInfo.Column));
- }
- }
- }
- }
- DXMenuItem CreateNewMenuItem(GridView view, int rowHandle, GridColumn column)
- {
- DXMenuItem copyitem = new DXMenuItem(MenuName.Replace("[Caption]", column.Caption.Replace("\r\n","")),
- new EventHandler(OnClearCellClick), null);
- copyitem.Tag = column;
- return copyitem;
- }
- }
- public class GridViewCreateNewCellItem : GridViewAddPopupMenuBase
- {
- #region 添加复制 Cell 菜单
- public static void CreateClearCellItem(GridView View)
- {
- CreateNewCellItem(View, "清除 [Caption]", DoClear);
- }
- private static void DoClear(object sender, EventArgs e)
- {
- GridColumn col = (GridColumn)((DXMenuItem)sender).Tag;
- col.View.SetRowCellValue(col.View.FocusedRowHandle, col, DBNull.Value);
- }
- #endregion
- }
使用: Load 事件增加
- GridViewCreateNewCellItem.CreateClearCellItem(gv_Wool);
- GridViewCreateNewCellItem.CreateClearCellItem(gv_Ast);
- GridViewCreateNewCellItem.CreateClearCellItem(gv_ZJ);
- GridViewCreateNewCellItem.CreateClearCellItem(gv_Process2);
- GridViewCreateNewCellItem.CreateClearCellItem(gv_SpecialProcess);
Demo 下载: http://pan.baidu.com/s/1bnCijtP
来源: https://www.devexpresscn.com/post/1084.html