خوب اگر اینطوری میخوای دو راه داری یکی اینکه منو رو به سلولها نسبت بدی که ...
راه دیگه هم اصلاح همون کد قبلی هست.
پس این حلقه رو خذف کن:
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
col.ContextMenuStrip = contextMenuStrip1;
}
به جاش همون رویداد CellMouseDown رو به کار ببر منتها اندیس سلول رو چک کن منفی نباشه:
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
dataGridView1.CurrentCell = dataGridView1[e.ColumnIndex, e.RowIndex];
contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);
}
}