C# 鼠标右键单击上下文Ustrip不';I don’我不是第一次来

C# 鼠标右键单击上下文Ustrip不';I don’我不是第一次来,c#,datagridview,mouseevent,contextmenustrip,C#,Datagridview,Mouseevent,Contextmenustrip,我得到了这部分代码,在这里我打开contextMenuStrip以响应鼠标右键单击(在dataGridView表上) 问题是,我第一次右键单击时,菜单不会弹出。在第二次出现的时候,一切都很顺利 private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);

我得到了这部分代码,在这里我打开contextMenuStrip以响应鼠标右键单击(在dataGridView表上)

问题是,我第一次右键单击时,菜单不会弹出。在第二次出现的时候,一切都很顺利

    private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
        int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;

        if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
         {
             dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row

             ContextMenuStrip Menu = new ContextMenuStrip();
             ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
             MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
             Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
             dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
         }
    }

有什么帮助吗?:)我使用visual studio 2012。

我通常创建自己的
ContextMenuStrip
对象(私有变量),并在需要时显示它。我怀疑它是第一次被分配的,但无法显示,因为新添加的菜单没有自己的右键单击触发器来显示。这只会在第二次发生,一旦它存在

像这样: 私有ContextMenuStrip_myMenu

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
    int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;

    if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
     {
         dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row

         _myMenu = new ContextMenuStrip();
         ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
         MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
         _myMenu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
         _myMenu.Show(new Point(e.X, e.Y));
     }
}

我通常创建自己的
ContextMenuStrip
对象(私有变量),并在需要时创建
Show()
对象。我怀疑它是第一次被分配的,但无法显示,因为新添加的菜单没有自己的右键单击触发器来显示。这只会在第二次发生,一旦它存在

像这样: 私有ContextMenuStrip_myMenu

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); //get info
    int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;

    if (e.Button == MouseButtons.Right) //MouseButton right: Open context menu strip.
     {
         dataGridView1.Rows[currentMouseOverRow].Selected = true; //Select the row

         _myMenu = new ContextMenuStrip();
         ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
         MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
         _myMenu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
         _myMenu.Show(new Point(e.X, e.Y));
     }
}

问题:您已在
右键单击事件后将
上下文菜单添加到
DataGridView
。因此,
ContextMenu
将在第一次
右键单击后添加到您的
DataGridView
,因此用户可以从进一步的
右键单击事件中查看附加的
ContextMenu

解决方案:在右键单击
DataGridView
之前,您需要添加
上下文菜单
,以便它将在每个
右键单击事件中显示

注意:如果将
上下文菜单
分配给任何控件,默认情况下它将显示在
右键单击
上,这意味着您不需要为控件上的每个
右键单击
事件添加它

尝试以下操作:在
表单加载
事件中

   private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        ContextMenuStrip Menu = new ContextMenuStrip();
        ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
        MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
        Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
        dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
    }

问题:您已在
右键单击事件后将
上下文菜单添加到
DataGridView
。因此,
ContextMenu
将在第一次
右键单击后添加到您的
DataGridView
,因此用户可以从进一步的
右键单击事件中查看附加的
ContextMenu

解决方案:在右键单击
DataGridView
之前,您需要添加
上下文菜单
,以便它将在每个
右键单击事件中显示

注意:如果将
上下文菜单
分配给任何控件,默认情况下它将显示在
右键单击
上,这意味着您不需要为控件上的每个
右键单击
事件添加它

尝试以下操作:在
表单加载
事件中

   private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        ContextMenuStrip Menu = new ContextMenuStrip();
        ToolStripMenuItem MenuOpenPO = new ToolStripMenuItem("Delete it");
        MenuOpenPO.Click += new EventHandler(MenuOpenPO_Click);
        Menu.Items.AddRange(new ToolStripItem[] { MenuOpenPO });
        dataGridView1.ContextMenuStrip = Menu; //Assign to dataGridView1
    }

+当不再需要旧菜单时,你应该把它处理掉,否则我想你会漏掉的resource@SriramSakthivel泄露什么?它是一个局部对象,作用域是父对象(我猜是一个
表单
)。它每次被初始化的事实并不表示有多个实例。您将泄漏一个
UserObject
,我指的是一个控件,在本例中为
ContextMenuStrip
。如果未引用控件,则不会对其进行垃圾收集,
ContextMenuStrip
也是一个控件。您正在创建
\u myMenu=new ContextMenuStrip()新实例,在哪里处理?通常不需要显式处理;一旦不再显示,旧对象将不被引用,并将由垃圾收集器清理。+1您应该在不再需要旧菜单时处理它,否则我认为您会泄漏resource@SriramSakthivel泄露什么?它是一个局部对象,作用域是父对象(我猜是一个
表单
)。它每次被初始化的事实并不表示有多个实例。您将泄漏一个
UserObject
,我指的是一个控件,在本例中为
ContextMenuStrip
。如果未引用控件,则不会对其进行垃圾收集,
ContextMenuStrip
也是一个控件。您正在创建
\u myMenu=new ContextMenuStrip()新实例,在哪里处理?通常不需要显式处理;一旦不再显示,旧对象将不被引用,并将由垃圾收集器清理。噢,哇。这解释了很多。谢谢你。通过禁用菜单绑定的控件,菜单很容易被禁用。哦,哇。这解释了很多。谢谢你。通过禁用绑定到的控件,可以轻松禁用菜单。