C# 为什么我的菜单在第一次单击时出现在错误的位置?

C# 为什么我的菜单在第一次单击时出现在错误的位置?,c#,.net,vb.net,winforms,C#,.net,Vb.net,Winforms,我正在从事一个VB Winforms项目,尽管我对C解决方案也很满意,并进行了以下设置: 我在表单上有一个ContextMenuStrip,msCreateReports 我在表单顶部有一个菜单项,其中一个菜单项是CreateReports,其下拉列表设置为msCreateReports 我在cmdCreateReports表单上有一个命令按钮 现在,对于“我的命令”按钮,其单击事件有以下代码: 编辑更新/解释: 基本上,我所寻找的功能是让这个contextmenustrip能够显示在两个不同的

我正在从事一个VB Winforms项目,尽管我对C解决方案也很满意,并进行了以下设置:

我在表单上有一个ContextMenuStrip,msCreateReports 我在表单顶部有一个菜单项,其中一个菜单项是CreateReports,其下拉列表设置为msCreateReports 我在cmdCreateReports表单上有一个命令按钮 现在,对于“我的命令”按钮,其单击事件有以下代码:

编辑更新/解释:

基本上,我所寻找的功能是让这个contextmenustrip能够显示在两个不同的地方之一,这取决于用户单击的位置。。。 如果用户单击菜单选项,关联菜单将显示为“创建报告”菜单项上的下拉菜单,或者如果用户单击命令按钮,则该菜单将显示为鼠标指针侧面的关联菜单。我希望同一个菜单能够出现在这两个位置中的任何一个,具体取决于用户单击此菜单的位置

现在,我的问题是,只有在第一次单击命令按钮时,ContextMenuStrip才会出现在菜单的顶部,而不是像我希望的那样出现在命令按钮的顶部

第一次单击后,菜单将显示在正确的位置。。。我做错了什么/我如何修复此问题

谢谢

Cursor.Position.X和Cursor.Position.Y是相对于表单的,您需要使用重载方法ContextMenuStrip.ShowControl control,Point pos

例如:

//control = the control you have added context menu
msCreateReports.Show(control, new Point(Cursor.Position.X, Cursor.Position.Y));

我在使用VisualStudio2010SP1和C时遇到了同样的问题。我不认为我们做错了什么,在我看来它像一个Winforms bug

我是这样修复的:

private void toolStripMyMenuItem_DropDownOpening(object sender, EventArgs e)
{
    toolStripMyMenuItemMyLists.DropDown = contextMenuStrip;
}

private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    toolStripMyMenuItemMyLists.DropDown = contextMenuStrip;
}
1我已使用可视化设计器取消设置主条带项目的下拉属性

2我在contextMenuStrip上定义了打开事件,在主条带项目上定义了DropDownOpen事件,如下所示:

private void toolStripMyMenuItem_DropDownOpening(object sender, EventArgs e)
{
    toolStripMyMenuItemMyLists.DropDown = contextMenuStrip;
}

private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    toolStripMyMenuItemMyLists.DropDown = contextMenuStrip;
}

我不再有这个问题了。希望它也能帮助你:-

我也有同样的问题。我相信这也是一个bug,因为这种行为只是第一次发生。因此,在用户有机会与它交互之前,我强制它打开然后关闭它。所以实际上,我在用户使用它之前使用过一次,然后它就可以正常工作了。下面是我在表单加载方法中添加的代码。我的组合框用于允许用户从打印机列表中进行选择

        printerToolStripMenuItem.ShowDropDown();
        toolStripComboBoxPrinter.Owner.Hide();
        printerToolStripMenuItem.Owner.Hide();

你能发布一些屏幕截图吗?不幸的是,我不能,因为工作互联网政策,但不幸的是,几乎没有什么可显示的-我单击按钮,第一次,菜单栏旁出现菜单提示,第二次它出现在按钮上的光标上,单击按钮时,通过修改其属性来确定其顶部的控件。您必须发布可以重现该行为的代码。在MenuStrip上使用ContextMenuStrip也是一件奇怪的事情。您是否输入了任何调试代码来显示当前光标的位置?您还应该能够检查控件的打开或打开事件处理程序中的当前光标位置。。。。这是完美的,它解决了两行代码的问题!!令人惊叹的非常感谢你!!!!我使用了与您启发我的相同的概念-谢谢,但仅使用上下文菜单方法键入ContextMenuStrip。每次打开上下文菜单时,我都使用以下顺序:显示、隐藏、显示。我必须将该逻辑封装在一个公共的父用户控件中,这就是为什么我在每次打开时都这样做,而不是在表单加载时。