junlingzhu2002 发表于 2012-11-5 15:52:00

右键菜单

我所做的一部分画面要求
在RowHeaderCell上点击鼠标右键时会出现一个右键菜单,
如果每个画面都写同样的程序会很麻烦,
所以有没有可能把它编辑成共同使用的程序

wedy.wang 发表于 2012-11-6 09:56:00

回复 1楼junlingzhu2002的帖子

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

    public class MyRowHeaderCell:RowHeaderCell
    {
      public MyRowHeaderCell()
      {
            System.Windows.Forms.ContextMenuStrip strip = new System.Windows.Forms.ContextMenuStrip();
            strip.Items.Add("This is menu stip item.");
            this.ContextMenuStrip = strip;
      }
    }

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

如果是一样的,可以写在MyRowHeaderCell里面吗?还是写在哪里呀。
我设定的ContextMenu是,行插入,行删除,复制,粘贴,前行复制
用ContextMenu.ItemClicked事件吗
不好意思,我还是新手,还不太熟练,
可以给一个简单的代码吗

wedy.wang 发表于 2012-11-15 10:41:00

回复 5楼junlingzhu2002的帖子

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

    class MyRowHeaderContextMenuStrip : ContextMenuStrip
    {
      private GcMultiRow _gcMultiROw;
      private int _rowIndexCache;
      public MyRowHeaderContextMenuStrip(GcMultiRow gcMultiRow)
      {
            _gcMultiROw = gcMultiRow;
            _gcMultiROw.CellMouseUp += _gcMultiROw_CellMouseUp;
            this.Items.Add("AddRow", null, new EventHandler(OnItemClick));
            this.Items.Add("RemoveRow", null, new EventHandler(OnItemClick));
      }

      void _gcMultiROw_CellMouseUp(object sender, CellMouseEventArgs e)
      {
            if (e.Scope == CellScope.Row)
            {
                _rowIndexCache = e.RowIndex;
            }
      }

      private void OnItemClick(object sender, EventArgs e)
      {
            ToolStripItem item = sender as ToolStripItem;
            if (item != null)
            {
                if (item.Text == "AddRow")
                {
                  _gcMultiROw.Rows.Insert(_rowIndexCache);
                }
                else if (item.Text == "RemoveRow")
                {
                  _gcMultiROw.Rows.RemoveAt(_rowIndexCache);
                }
            }
      }
    }


然后在Form_Loaded事件处理函数当中构造一个自定义的MyRowHeaderContextMenuStrip,设置给对应的RowHeaderCell.ContextMenuStrip属性:
private void Form1_Load(object sender, EventArgs e)
      {
         //假定Cell0是RowHeaderCell
            this.gcMultiRow1.Template.Row.Cells.ContextMenuStrip = this.myRowHeaderContextMenuStrip1;
          //重新加载模板
            this.gcMultiRow1.Template = this.gcMultiRow1.Template;
      }
页: [1]
查看完整版本: 右键菜单