首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >WinForms ContextMenu在单击MenuItem时保持打开状态

WinForms ContextMenu在单击MenuItem时保持打开状态
EN

Stack Overflow用户
提问于 2017-03-17 23:29:47
回答 2查看 1.6K关注 0票数 0

所以我有一个表单DataGridView,当我右键单击网格时,我想要显示一个上下文菜单,其中有一个菜单项。菜单项将打开第二个表单,该表单将为DataGridView提供一些配置选项。

现在,所有这些都工作得很好,上下文菜单正确显示,第二个表单正确打开,该表单上的所有功能都正常工作。

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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事件处理程序来打开菜单,它将反复尝试呈现菜单,使其在最终呈现之前闪烁几次

EN

回答 2

Stack Overflow用户

发布于 2017-03-17 23:37:22

在您的类中添加一个私有变量

代码语言:javascript
代码运行次数:0
运行
复制
private bool CloseMenu = true;

在上下文菜单中按下鼠标

代码语言:javascript
代码运行次数:0
运行
复制
private void Item_Click(object sender, EventArgs e)
{
    CloseMenu = false;
    new SecondForm().Show();
}

添加上下文菜单关闭事件

代码语言:javascript
代码运行次数:0
运行
复制
private void contextMenuStripMy_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    e.Cancel = !CloseMenu;
    CloseMenu = true;
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-06 09:25:14

经过多次试验,我在这个问题上找到了一些解决方法。

首先,这是关于ContextMenu而不是ContextMenuStrip。

这不是完美的解决方案,但如果您没有其他替代解决方案,它工作得很好。

下面是如何实现的。

只需在上下文菜单下为所有MenuItems设置Visiable = false即可。

唯一的问题是它会在鼠标周围显示小方块。

我想这个小方块就是空的上下文菜单框。

但是,如果用户在任意位置单击,并且上下文菜单失去焦点,则此小方块将被快速删除。

它真的很小,一点也不麻烦。

在代码中,如果您只有一个菜单项,则如下所示。

代码语言:javascript
代码运行次数:0
运行
复制
                 if (cm != null)
                {
                    if (cm.MenuItems.Count > 0) cm.MenuItems[0].Visible = false;
                }

如果您有多个菜单项,那么只需遍历所有菜单项。

代码语言:javascript
代码运行次数:0
运行
复制
                 if (cm != null)
                {
                    for(int i = 0; i < cm.MenuItems.Count ; i++)
                     cm.MenuItems[i].Visible = false;
                }

希望这能有所帮助。

对我的案子很管用。

所以我不需要从ContextMenu切换到ContextMenuStrip。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42861477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档