WinForms ContextMenu在MenuItem被点击时保持打开状态

WinForms ContextMenu在MenuItem被点击时保持打开状态

问题描述:

所以我有一个表格DataGridView,当我在网格上点击右键时,我想显示一个菜单项中有一个菜单项的上下文菜单。该菜单项将打开第二个窗体,为DataGridView提供一些配置选项。WinForms ContextMenu在MenuItem被点击时保持打开状态

现在所有这些工作都非常好,上下文菜单正确显示,并且第二个窗体可以正确打开,并且该窗体上的所有功能都能正常工作。

唯一的问题是,只有当我点击菜单项以外的任何地方时,上下文菜单才会关闭。无论我点击菜单项多少次,上下文菜单都不会关闭。

我试过寻找解决方法,但据我所知,没有办法以编程方式关闭上下文菜单。

任何帮助将不胜感激。以下是用于打开上下文菜单和菜单项点击事件的点击事件的副本。

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(); 
} 

更新: 我用了的ContextMenuStrip类替换ContextMenu类,取出鼠标点击事件处理和分配的ContextMenuStrip对象DataGridView.ContextMenuStrip解决的问题。看起来好像ContextMenuStrip类处理显示菜单,当相关的控件被右键单击时,所以如果添加一个单击事件处理程序来处理打开菜单,它会反复尝试渲染菜单,使其闪烁几次最终呈现

+0

你的代码中没有任何地方试图隐藏上下文菜单。我会尝试做点什么,但是你应该保存对你在表单中创建的ContextMEnu的引用,或者你可以使用'sender'变量,将它作为ContextMenu转换,然后尝试Hide()。 –

+0

@GuillaumeCR我已经尝试过各种方法来隐藏上下文菜单,但似乎没有一种隐藏函数要调用或设置可见性属性。在以前的应用程序中,当菜单项被点击时,我已经建立了自动关闭的上下文菜单我无法弄清楚为什么它不这样做 – ltw1991

+0

很难猜测*其他*代码可能导致CMS的行为如何。总是先尝试一下你自己发布的片段,以验证它仍然以相同的方式行事不端。随意选择CellMouseUp事件和ContextMenuStrip类。 –

在你的类添加了你的上下文菜单的私有变量

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; 
} 
+0

所以当我创建我的菜单项如下: 'cm.MenuItems。Add(new MenuItem(“Item”,Item_Click));' 我用关闭事件方法调用替换Item_Click方法调用并将旧方法的内容放在关闭事件方法的开始? – ltw1991