定制DataGridView快捷菜单ContextMenuStrip的关联事件

这篇博客介绍了如何在Windows Forms中自定义DataGridView控件的ContextMenuStrip,使其在鼠标右击时能根据位置计算行号和列号,并触发自定义事件。作者通过重写MouseDown方法或WndProc消息处理函数来捕获鼠标右击事件,计算坐标并调用自定义的ContextMenuStripNeeded事件。同时,提供了源码和示例程序以供参考。
摘要由CSDN通过智能技术生成

(原创文章,转载请注明来源:http://blog.csdn.net/hulihui)

前言

经常使用表格控件DataGridView的行关联快捷菜单(也称为上下文弹出菜单)ContextMenuStrip,基本步骤如下:

  • 在窗体上设计ContextMenuStrip快捷菜单控件;
  • 设置DataGridView.RowTemplate.ContextMenuStrip属性为指定的快捷菜单;
  • 在菜单弹出前捕获关联事件DataGridView.RowContextMenuStripNeeded,获得当前行与快捷菜单,并做适当处理。

但是,使用其关联事件DataGridView.RowContextMenuStripNeeded有一个重要的前提:“RowContextMenuStripNeeded 事件仅在设置了DataGridView控件的DataSource属性或者该控件的VirtualMode属性为 true 时发生。”(参考MSDN:RowContextMenuStripNeeded 事件)。

此外,上述方法还有一个不足之处:在非数据行的地方(如:表格列头或行头)不能使用RowTemplate.ContextMenuStrip快捷菜单,也捕获不到事件DataGridView.RowContextMenuStripNeeded事件。当然,还可以使用其它类似事件,如:CellContextMenuStripNeeded,等等。但它们均受到同样的约束。

事实上,DataGridView.ContextMenuStrip是控件本身的快捷菜单。本文介绍的定制DataGridView控件,就是直接应用其ContextMenuStrip属性,定制一个快捷菜单关联事件,实现RowTemplate.ContextMenuStrip类似功能。基本思路如下:

  • 重写DataGridView.MouseDown(MouseEventArgs e)方法,捕获鼠标右击事件;
  • 根据事件参数MouseEventArgs的鼠标位置,计算DataGridView当前位置的行号与列号;
  • 定制关联事件ContextMenuStripNeeded,在快捷菜单弹出前获取行号、列号与快捷菜单对象对象。

关键技术

捕获鼠标右击位置(坐标),根据该位置计算当前行号与列号,并引发自定义关联事件。如下代码是捕获鼠标右击事件(定制DataGridView控件中的代码):

只有在ContextMenuStrip属性对象非空,以及定制关联事件ContextMenuStripNeeded非空(即有事件注册者)时,才需要计算行列坐标,并由OnContextMenuStripNeeded引发调用事件处理方法。当前鼠标位置的行/列编号计算方法如下:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值