防止单击数据表格空白部分出现上下文菜单

5

当在C#中右键单击DataGridView的空白部分(即单击不包含行的网格部分)时,上下文菜单仍然会出现,其中包含基于行的选项。如何只在单击落在行上时才出现上下文菜单?

这是我已经做到的程度:

    private void f_context_select_row(object sender, MouseEventArgs e)
    {

            if (e.Button == MouseButtons.Right)
            {

                var hti = jobs_datagrid.HitTest(e.X, e.Y);
                if (hti.RowIndex >= 0)
                {
                    jobs_datagrid.ClearSelection();
                    jobs_datagrid.Rows[hti.RowIndex].Selected = true;
                }
                else
                {
                    //what can I do here to collapse the context menu?
                }
            }

    }

我正在通过编程的方式构建Datagrid和上下文菜单,代码如下:
                    //on right click select row
                    jobs_datagrid.MouseDown += new MouseEventHandler(f_context_select_row);

                    //generate context menu
                    ContextMenuStrip m = new ContextMenuStrip();

                    ToolStripMenuItem context_datagrid_run = new ToolStripMenuItem("Run All Selected Campaigns");
                    ToolStripMenuItem context_datagrid_edit = new ToolStripMenuItem("Edit This Campaign");
                    ToolStripMenuItem context_datagrid_delete = new ToolStripMenuItem("Delete This Campaign");
                    context_datagrid_delete.Click += f_context_datagrid_delete;
                    context_datagrid_run.Click += f_run_selected_campaigns;
                    context_datagrid_edit.Click += f_context_datagrid_edit;

                    m.Items.Add(context_datagrid_delete);
                    m.Items.Add(context_datagrid_run);
                    m.Items.Add(context_datagrid_edit);
                    jobs_datagrid.ContextMenuStrip = m;

                    splitContainer3.Panel2.Controls.Add(jobs_datagrid);

你在哪里调用 [ContextMenu] 的 Show() 方法? - Raj Ranjhan
我更新了问题,展示了更多有关我构建上下文菜单的信息。我认为没有任何.show事件。我正在使用Visual C# Express进行工作。 - atwellpub
2个回答

14

ContextMenuStrip.Opening 事件呢?

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            var cms = sender as ContextMenuStrip;
            var mousepos = Control.MousePosition;
            if (cms != null)
            {
                var rel_mousePos = cms.PointToClient(mousepos);
                if (cms.ClientRectangle.Contains(rel_mousePos))
                {
                    //the mouse pos is on the menu ... 
                    //looks like the mouse was used to open it
                    var dgv_rel_mousePos = dataGridView1.PointToClient(mousepos);
                    var hti = dataGridView1.HitTest(dgv_rel_mousePos.X, dgv_rel_mousePos.Y);
                    if (hti.RowIndex == -1)
                    { 
                        // no row ...
                        e.Cancel = true;
                    }
                }
                else
                {
                    //looks like the menu was opened without the mouse ...
                    //we could cancel the menu, or perhaps use the currently selected cell as reference...
                    e.Cancel = true;
                }
            }
        }

0

这不是我的解决方案,但我通过DarkSquirrel42的答案得到了类似问题的解决方案...谢谢!:)

    /// <summary>
    /// Evento que permite ubicar la posicion del mouse y muestra el menu contextual.
    /// </summary>
    private void dgw_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            /*Obtener y seleccion celda donde se hizo el click*/
            DataGridView.HitTestInfo _htInfo = dgw.HitTest(e.X, e.Y);
            dgw.CurrentCell = dgw[_htInfo.ColumnIndex, _htInfo.RowIndex];

            //Invocar evento de apertura de Menu Contextual donde se ocultara si la celda es de lectura,
            //O se mostrara  si la celda es de edicion.
            dgw.ContextMenuStrip.Opening += (s, i) =>
                {
                    if (dgw.CurrentCell.ReadOnly)
                        i.Cancel = true;//Evita que se muestre el Menu Contextual
                    else
                    {
                        i.Cancel = false;//Permite que se muestre el Menu Contextual
                        ContextMenu.Show(dgw, new Point(e.X, e.Y));                            
                    }                            
                };                    
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接