在使用 GridControl 的時候經常需要添加右鍵菜單。一般的做法是自己創建菜單項,然後註冊GridView的Mouse-Click事件,然後Show出定義好的菜單。但是涉及到一些單擊事件會收到編輯器編輯狀態影響,所以Mouse-Click事件不好用。
幸好,GridView自帶了一個默認的右鍵事件,專門用於彈出右鍵菜單用:PopupMenuShowing
爲了調用方便,設計成一個靜態方法,調用的時候只用傳入需要註冊的網格就好:
GridViewMenuHelper.CreateCopyCellItem(gdvw);
這裏,爲傳入網格添加一個名爲【複製XXX】(XXX爲列頭)的方法,可以將鼠標點中的Cell中的數據複製到剪貼板。
效果圖如下:
實現代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #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 |
補充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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事件增加
1 2 3 4 5 | GridViewCreateNewCellItem.CreateClearCellItem(gv_Wool); GridViewCreateNewCellItem.CreateClearCellItem(gv_Ast); GridViewCreateNewCellItem.CreateClearCellItem(gv_ZJ); GridViewCreateNewCellItem.CreateClearCellItem(gv_Process2); GridViewCreateNewCellItem.CreateClearCellItem(gv_SpecialProcess); |