2 Pluspunkte 0 Minuspunkte
Wie kann ich bei einem Rechtsklick auf einen DataGridView erkennen worauf geklickt wurde (Zeile und Spalte) und ein entsprechendes Kontextmenü anzeigen?
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

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);
    }
}

von (884 Punkte)