找回密码
 立即注册

QQ登录

只需一步,快速开始

junlingzhu2002

银牌会员

38

主题

150

帖子

3344

积分

银牌会员

积分
3344

活字格认证

junlingzhu2002
银牌会员   /  发表于:2012-11-5 15:52  /   查看:6418  /  回复:5
我所做的一部分画面要求
在RowHeaderCell上点击鼠标右键时会出现一个右键菜单,
如果每个画面都写同样的程序会很麻烦,
所以有没有可能把它编辑成共同使用的程序

5 个回复

倒序浏览
wedy.wang
初级会员   /  发表于:2012-11-6 09:56:00
沙发
回复 1楼junlingzhu2002的帖子

你可以写一个自定的Cell类型,这个Cell从RowHeaderCell派生,比如说MyRowHeaderCell,在他的构造函数当中把你定义的ContextMenu设置给这个Cell,以后所有的Template当中用到RowHeaderCell的地方,都改成使用这个MyRowHeaderCell,就行了。参考下面的C#代码:

  1.     public class MyRowHeaderCell:RowHeaderCell
  2.     {
  3.         public MyRowHeaderCell()
  4.         {
  5.             System.Windows.Forms.ContextMenuStrip strip = new System.Windows.Forms.ContextMenuStrip();
  6.             strip.Items.Add("This is menu stip item.");
  7.             this.ContextMenuStrip = strip;
  8.         }
  9.     }
复制代码
回复 使用道具 举报
junlingzhu2002
银牌会员   /  发表于:2012-11-8 08:33:00
板凳
谢谢,那strip.Clicked是要写在自己里面是吗
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2012-11-8 09:12:00
地板
回复 3楼junlingzhu2002的帖子

那要看你的逻辑是不是通用的,如果都不一样,就需要分开写。
回复 使用道具 举报
junlingzhu2002
银牌会员   /  发表于:2012-11-8 12:48:00
5#
如果是一样的,可以写在MyRowHeaderCell里面吗?还是写在哪里呀。
我设定的ContextMenu是,行插入,行删除,复制,粘贴,前行复制
用ContextMenu.ItemClicked事件吗
不好意思,我还是新手,还不太熟练,
可以给一个简单的代码吗
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2012-11-15 10:41:00
6#
回复 5楼junlingzhu2002的帖子

你可以写一个自定的ContextMenuStrip,比如下面:

  1.     class MyRowHeaderContextMenuStrip : ContextMenuStrip
  2.     {
  3.         private GcMultiRow _gcMultiROw;
  4.         private int _rowIndexCache;
  5.         public MyRowHeaderContextMenuStrip(GcMultiRow gcMultiRow)
  6.         {
  7.             _gcMultiROw = gcMultiRow;
  8.             _gcMultiROw.CellMouseUp += _gcMultiROw_CellMouseUp;
  9.             this.Items.Add("AddRow", null, new EventHandler(OnItemClick));
  10.             this.Items.Add("RemoveRow", null, new EventHandler(OnItemClick));
  11.         }

  12.         void _gcMultiROw_CellMouseUp(object sender, CellMouseEventArgs e)
  13.         {
  14.             if (e.Scope == CellScope.Row)
  15.             {
  16.                 _rowIndexCache = e.RowIndex;
  17.             }
  18.         }

  19.         private void OnItemClick(object sender, EventArgs e)
  20.         {
  21.             ToolStripItem item = sender as ToolStripItem;
  22.             if (item != null)
  23.             {
  24.                 if (item.Text == "AddRow")
  25.                 {
  26.                     _gcMultiROw.Rows.Insert(_rowIndexCache);
  27.                 }
  28.                 else if (item.Text == "RemoveRow")
  29.                 {
  30.                     _gcMultiROw.Rows.RemoveAt(_rowIndexCache);
  31.                 }
  32.             }
  33.         }
  34.     }
复制代码


然后在Form_Loaded事件处理函数当中构造一个自定义的MyRowHeaderContextMenuStrip,设置给对应的RowHeaderCell.ContextMenuStrip属性:
  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.            //假定Cell0是RowHeaderCell
  4.             this.gcMultiRow1.Template.Row.Cells[0].ContextMenuStrip = this.myRowHeaderContextMenuStrip1;
  5.           //重新加载模板
  6.             this.gcMultiRow1.Template = this.gcMultiRow1.Template;
  7.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部