Постановка задачи. Необходимо, при вызове контекстного меню для DataGridView получить ячейку, над которой оно (меню) было вызвано.
Для чего может понадобиться. Например, мы хотим реализовать возможность редактирования отдельных ячеек строки грида, но при этом предоставлять такую возможность только через новую форму, а не напрямую в самой ячейке грида.
Для этого, вызывая контекстное меню на DataGridView необходимо получить ячейку, непосредственную под контекстным меню, иначе изменения будут происходить с другой, активной в данный момент, ячейкой.
К примеру, если активна ячейка с данными «+38 067 895 96 03», а мы вызываем контекстное меню над ячейкой «Бартоломей Олег», то требуется дальше работать именно с ячейкой «Бартоломей Олег». Задача, я думаю, ясна.

MSDN предлагает довольно простой способ реализации задуманного. Но я немного его переделаю под использование класса Point
Первое, что нам понадобится, это поместить на форму контрол ContextMenuStrip и назначить его в качестве свойства ContextMenuStrip для DataGridView:
MyDataGridView.ContextMenuStrip = MyContextMenuStrip;
Теперь, в данное контекстное меню добавим пункт меню для, скажем, удаления строки.
Дальше, подпишемся на событие CellMouseEnter для нашего грида, предварительно создав на уровне класса объект типа Point:
Point point = new Point();
private void dataGridView_CellMouseEnter(
object sender, DataGridViewCellEventArgs ee)
{
point.X = ee.ColumnIndex;
point.Y = ee.RowIndex;
}
А в обработчике события просто устанавливаем свойства X и Y для point.Зачем это надо?
Подписываемся на событие выбора пункта контекстного меню для удаления строки:
private void DeleteThisRowToolStripMenuItem_Click(
object sender, EventArgs e)
{
Debitors.Rows[point.Y].Delete();
}
И дело в том, что удалять строку, непосредственно находящуюся под местом вызова контекстного меню, следует по параметру Rows[ee.RowIndex]. Но, как вы понимаете, параметр ee не доступен в методе DeleteThisRowToolStripMenuItem_Click. Потому мы создали переменную point на уровне класса и её область видимости распространяется на метод DeleteThisRowToolStripMenuItem_Click.
ДОПОЛНЕНИЕ.
В статье эффект слежения в DataGridView рассказывается о выполнении эффекта слежения активной ячейки за перемещающимся курсором мыши. В этом случае, получение требуемой строки возможно и так:
private void dataGridView_CellMouseEnter(object sender,
DataGridViewCellEventArgs e)
{
if (e.ColumnIndex > -1 && e.RowIndex > -1)
dataGridView1.CurrentCell =
dataGridView1[e.ColumnIndex, e.RowIndex];
}
private void DeleteThisRowToolStripMenuItem_Click(
object sender, EventArgs e)
{
Debitors.Rows[dataGridView1.CurrentRow.Index].Delete();
}