所以我有一个表单DataGridView,当我右键单击网格时,我想要显示一个上下文菜单,其中有一个菜单项。菜单项将打开第二个表单,该表单将为DataGridView提供一些配置选项。
现在,所有这些都工作得很好,上下文菜单正确显示,第二个表单正确打开,该表单上的所有功能都正常工作。
唯一的问题是,只有当我单击菜单项以外的任何位置时,上下文菜单才会关闭。无论我在菜单项上单击多少次,上下文菜单都不会关闭。
我试着寻找解决办法,但就我所知,没有办法以编程方式关闭上下文菜单。
任何帮助都将不胜感激。下面是用于打开上下文菜单和菜单项单击事件的单击事件的副本。
private void DataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
DataGridView dgv = (DataGridView)sender;
if (dgv.CurrentCell == null)
{
return;
}
else
{
Rectangle r = dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
Point p = new Point(r.X + e.X, r.Y + e.Y);
ContextMenu cm = new ContextMenu();
cm.MenuItems.Add(new MenuItem("Item", Item_Click));
cm.Show(dgv, p);
}
}
}
private void Item_Click(object sender, EventArgs e)
{
new SecondForm().Show();
}
更新:通过将ContextMenu类替换为ContextMenuStrip类、删除MouseClick事件处理程序并将ContextMenuStrip对象分配给DataGridView.ContextMenuStrip,我解决了这个问题。看起来好像ContextMenuStrip类负责在右键单击相关控件时显示菜单,所以如果添加一个click事件处理程序来打开菜单,它将反复尝试呈现菜单,使其在最终呈现之前闪烁几次
发布于 2017-03-17 15:37:22
在您的类中添加一个私有变量
private bool CloseMenu = true;
在上下文菜单中按下鼠标
private void Item_Click(object sender, EventArgs e)
{
CloseMenu = false;
new SecondForm().Show();
}
添加上下文菜单关闭事件
private void contextMenuStripMy_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
e.Cancel = !CloseMenu;
CloseMenu = true;
}
发布于 2020-03-06 01:25:14
经过多次试验,我在这个问题上找到了一些解决方法。
首先,这是关于ContextMenu而不是ContextMenuStrip。
这不是完美的解决方案,但如果您没有其他替代解决方案,它工作得很好。
下面是如何实现的。
只需在上下文菜单下为所有MenuItems设置Visiable = false即可。
唯一的问题是它会在鼠标周围显示小方块。
我想这个小方块就是空的上下文菜单框。
但是,如果用户在任意位置单击,并且上下文菜单失去焦点,则此小方块将被快速删除。
它真的很小,一点也不麻烦。
在代码中,如果您只有一个菜单项,则如下所示。
if (cm != null)
{
if (cm.MenuItems.Count > 0) cm.MenuItems[0].Visible = false;
}
如果您有多个菜单项,那么只需遍历所有菜单项。
if (cm != null)
{
for(int i = 0; i < cm.MenuItems.Count ; i++)
cm.MenuItems[i].Visible = false;
}
希望这能有所帮助。
对我的案子很管用。
所以我不需要从ContextMenu切换到ContextMenuStrip。
https://stackoverflow.com/questions/42861477
复制