方法一:
private void gridControl_MouseUp(object sender, MouseEventArgs e)
{
try
{
GridHitInfo info = gvEmployee.CalcHitInfo(e.Location);
if (e.Button == MouseButtons.Right && info.InRowCell)
{
popupMenu.ShowPopup(gridControl.PointToScreen(e.Location));
}
}
catch (Exception ex)
{
ShowFormHelper.Error(ex);
}
}
方法二:
private void gridControl_MouseUp(object sender, MouseEventArgs e)
{
try
{
GridHitInfo info = gvEmployee.CalcHitInfo(e.Location);
if (e.Button == MouseButtons.Right && info.InRowCell)
{
popupMenu.ShowPopup(Control.MousePosition);
}
}
catch (Exception ex)
{
ShowFormHelper.Error(ex);
}
}
方法一和方法二的区别在于,PopupMenu控件ShowPopup()方法中的参数不同。
方法二中使用Control.MousePosition,虽然说能够弹出右键菜单,但是存在的问题是:
如果你右键菜单有很多项,或者加载菜单内容需要一些时间的时候,操作人员在选择数据的位置鼠标右键点击了一下,然后快速移动了鼠标,由于点击的时候右键菜单还在加载中,而鼠标乱移动后才加载完。导致最后右键菜单显示的位置不是鼠标点击所在的位置。
方法一则会显示在鼠标点击的那个位置的右下方弹出菜单。
由于很多控件都需要这个右键菜单,则可以封装一个弹出菜单的方法
/// <summary>
/// 设置控件点击位置弹出右键菜单
/// </summary>
/// <param name="controls"></param>
/// <param name="menu"></param>
/// <param name="e"></param>
public void SetPopupPosition(Control controls, PopupMenu menu, MouseEventArgs e)
{
menu.ShowPopup(controls.PointToScreen(e.Location));
}