C#DataGridView在右键单击位置打开ContextMenu

时间:2016-07-21 17:15:07

标签: c# winforms datagridview contextmenu

我已经看了很长一段时间,现在试图找到一个有效的解决方案,但我正在提出问题:

我的应用程序中的对话框表单中有一个DataGridView,我希望在单击鼠标右键时出现一个ContextMenu。

我右键单击并且ContextMenu看起来很好,但是不管我在StackExchange上尝试什么解决方案,它总是非常偏移。

这是与表格和/或其父母有关吗?或者我只是在这里愚蠢地遗漏了什么?

由于 杰米

Form.cs

private void dataGridContents_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        if (e.RowIndex > -1 && e.ColumnIndex > -1)
        {
            Debug.WriteLine("Cell right clicked!");

            DataGridViewCell cell = (sender as DataGridView)[e.ColumnIndex, e.RowIndex];

            contextCell.Show(cell.DataGridView, PointToClient(Cursor.Position));

            if (!cell.Selected)
            {
                cell.DataGridView.ClearSelection();
                cell.DataGridView.CurrentCell = cell;
                cell.Selected = true;
            }
        }
    }
}

修改

对不起,我试过了:

  • new Point(e.X, e.Y)
  • new Point(e.Location.X, e.Location.Y)
  • new Point(MousePosition.X, MousePosition.Y)
  • PointToClient(e.X, e.Y)
  • new Point(Cursor.Position.X, Cursor.Position.Y)
  • Control.MousePosition
  • Cursor.Position

可能还有其他几个。

修改2

这就是我所说的偏移 - 一些解决方案导致这个偏移量在某些幅度上变化(有些真的很远等) - 但是所有偏移都像实际光标那样偏移。

enter image description here

编辑3

我的contextCellnew ContextMenu()

3 个答案:

答案 0 :(得分:3)

选项1:显示行上下文菜单的最简单解决方案是将上下文菜单分配给DataGridView的RowTemplate.ContextMenuStrip属性:

dataGridView1.RowTemplate.ContextMenuStrip = contextMenuStrip1;

选项2:此外,如果您想在显示ContextMenuStrip之前选择单元格,则足以处理CellContextMenuStripNeeded事件:

private void dataGridView1_CellContextMenuStripNeeded(object sender,
    DataGridViewCellContextMenuStripNeededEventArgs e)
{
    if (e.RowIndex > -1 && e.ColumnIndex > -1)
    {
        dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
        e.ContextMenuStrip = contextMenuStrip1;
    }
}

你的错误是什么?

您正在以错误的方式计算DataGridView上的鼠标位置。您正在使用PointToClient,这意味着this.PointToClient,而您需要使用DataGridView的方法,例如dataGridView1.PointToClient

myContextMenu.Show(dataGridView1,dataGridView1.PointToClient(Cursor.Position));

只是为了您的信息,您只需使用此代码显示ContextMenu即可,无需使用ContextMenuStrip

但我强烈建议您使用ContextMenuStrip

答案 1 :(得分:1)

this.dataGridView1.ContextMenuStrip = this.contextMenuStrip1;

并处理DataGridView.CellContextMenuStripNeeded Event

答案 2 :(得分:0)

答案是让contextCell成为ContextMenuStrip而不是ContextMenu

毕竟........

感谢您的回复。