编辑3:很明显RowTemplate.ContextMenuStrip
并非设计为任何理智的程序员使用。除了下面描述的所有问题之外,为每一行生成的上下文菜单是原始的克隆 - 但仅限于第一级。任何子菜单不都会出现在上下文菜单中。显然它也会导致memory leak。故事的寓意:不要永远使用RowTemplate.ContextMenuStrip
。
所以我认为当用户右键单击DataGridView
的任意一行时,我想出了显示上下文菜单的“正确”方法,但是当用户右键单击{{}内的空白区域时1}}:
通过设置DataGridView
的{{1}}的{{1}}属性,我可以轻松地将上下文菜单附加到ContextMenuStrip
的每一行。但是,在显示上下文菜单时,我需要知道右键单击了哪个行。通常,知道上下文菜单来自何处的方法是使用RowTemplate
属性,但在这种情况下,该属性仅返回DataGridView
,因为显然DataGridView
不是控件。那我怎么知道右键单击了哪一行?
编辑:我发现在以这种方式为行分配上下文菜单时,每行实际上都有一个相同ContextMenuStrip.SourceControl
的克隆。这意味着我们可以将每个DataGridView
的{{1}}属性设置为相应的DataGridViewRow
。但是我不知道这是否效率低,如果这会引起其他看不见的问题。
编辑2:我认为ContextMenuStrip
属性返回null,但这是不正确的 - 我正在检查原始Tag
的{{1}}属性,ContextMenuStrip
开放只是一个克隆。
编辑3:请参阅问题的顶部。
答案 0 :(得分:0)
您使用“CellMouseEnter”。
{
...
dataGridView1.CellMouseEnter += new DataGridViewCellEventHandler(dataGridView1_CellMouseEnter);
menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
}
void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
mPoint = dataGridView1.PointToClient(Cursor.Position);
}
private void menuItem1_Click(object sender, EventArgs e)
{
DataGridView.HitTestInfo hitTestInfo = dataGridView1.HitTest(mPoint.X, mPoint.Y);
Console.WriteLine(hitTestInfo.RowIndex + ", " + hitTestInfo.ColumnIndex);
}