DevExpress使用教程:XtraGridControl动态添加右键菜单

2018-02-12 10:44:46来源:https://www.devexpresscn.com/post/1084.html作者:极客头条人点击

分享

在使用 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


Via GarsonZhang



===============================================================


更多精彩预告请持续关注DevExpress中文网!
扫描关注DevExpress中文网微信公众号,及时获取最新动态及最新资讯




最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台