Das kannst du mit einem ContextmenuStrip.
private ContextMenuStrip contextMenuStrip1;
In der InitializeComponent Methode setzt du die Elemente des Contextmenü und die jeweiligen Callbacks.
this.contextMenuStrip1 = new ContextMenuStrip();
var menuItem1 = new ToolStripMenuItem("Element 1", null, OnElement1Click);
this.contextMenuStrip1.Items.AddRange(new ToolStripItem[] { menuItem1 });
Beispielhafte Implementierung des MenuItems-Callback.
private void OnElement1Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count > 0)
{
int columnIndex = dataGridView1.SelectedCells[0].ColumnIndex;
int rowIndex = dataGridView1.SelectedCells[0].RowIndex;
}
}
Deinem DataGridView setzt du einen Handler für das CellMouseClick-Event
this.dataGridView1.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.DataGridView1_CellMouseClick);
In diesem Callback kannst du die Zeile und die Spalte erkennen, außerdem ruft sie den Callback des ContextMenuItem auf.
private void DataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
contextMenuStrip1.Show(Cursor.Position);
}
}