c#如何仅在datatgirdview控件的头部(列名处)添加右键菜单
近期在弄ArcgisAE实习,其中有一个功能是需要操作图层的属性字段的,为了方便操作图层的属性,最好是在图层的属性表中,也就是在显示图层属性的DataGirdView控件的头部添加一个右键菜单来实现相应的功能。
在c#中有个有一个右键菜单的组建contextMenuStrip,在这个控件里面可以添加一些处理属性字段的功能,然后将这个控件赋予给DataGirdView的contextMenuStrip属性就可以了,然而这种方式在DataGirdView控件的任何地方都会将这个右键菜单显示出来,在行中,列中都会显示出来,这样就没有达到我们预期想要的效果。
于是自己再MSDN随意的查看DataGirdView各种属性和事件,终于发现了一个可以拼凑的方式实现DataGirdView列的右键菜单的方法。
DataGirdView控件有一个ColumnHeaderMouseClick这样的事件,这个事件只在单击DataGirdView控件的头部即我们想要的地方时候才会触发该事件,并且该事件还有一个点击在列的一个列索引。
原理如下:
1、不使用该控件的contextMenuStrip属性
2、利用DataGirdView控件的ColumnHeaderMouseClick事件,在每次触发事件的时候在鼠标单击的地方将右键菜单用代码的方式显示出来。
具体代码如下所示:
1、添加一个右键菜单控件
2、在DataGirdView控件的ColumnHeaderMouseClick写如下的代码
//MousePostion是相对于屏幕来的,而右键菜单的Show方法也是相对屏幕坐标的 // MessageBox.Show(e.Location.ToString()); if (e.Button == MouseButtons.Right) { //可以获取单击的列的索引 int index = e.ColumnIndex; this.contextMenuStrip1.Show(MousePosition.X, MousePosition.Y); }
这样就可以实现DataGirdView控件中头部(列名处)的右键菜单了。
ps:有几种方式可以获取鼠标坐标的方式,但是各自的具体含义或者说是参照原点不一样
1、MousePosition类有一个静态的X,Y属性,它获取的坐标是相对于屏幕的坐标原点来的,也就是左上角。
2、任何控件的鼠标事件有个一个参数e,e有两个X,Y数据,这个坐标是相对于该控件的坐标原点的。
3、Cursor类有个静态属性Position,代表鼠标当前的位置,该方式获取的坐标和MousePosition方式是一样的,都是相对于屏幕的坐标原点的。