我已经看了很长一段时间,现在试图找到一个有效的解决方案,但我正在提出问题:
我的应用程序中的对话框表单中有一个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
这就是我所说的偏移 - 一些解决方案导致这个偏移量在某些幅度上变化(有些真的很远等) - 但是所有偏移都像实际光标那样偏移。
编辑3
我的contextCell
是new ContextMenu()
答案 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
。
毕竟........
感谢您的回复。