2016-07-21 20 views
2

Ich habe um für eine ganze Weile sah versuchen, eine funktionierende Lösung zu finden, aber ich Zuflucht eine Frage zu stellen:C# Datagridview ContextMenu an der Stelle von der rechten Öffnung Klicken Sie

Ich habe eine Datagridview in einem Dialog-Formular in meiner app, dass ich möchte, dass ein ContextMenu bei Rechtsklick auf Zelle erscheint.

Ich habe die rechte Maustaste und das ContextMenu scheint gut, aber egal welche Lösung auf StackExchange ich versuche, es ist immer ziemlich viel versetzt.

Ist dies mit der Form und/oder es ist Elternteil? Oder verpasse ich hier nur etwas Dummes?

Dank Jamie

Form.cs

private void dataGridContents_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     if (e.RowIndex > -1 && e.ColumnIndex > -1) 
     { 
      Debug.WriteLine("Cell right clicked!"); 

      DataGridViewCell cell = (sender as DataGridView)[e.ColumnIndex, e.RowIndex]; 

      contextCell.Show(cell.DataGridView, PointToClient(Cursor.Position)); 

      if (!cell.Selected) 
      { 
       cell.DataGridView.ClearSelection(); 
       cell.DataGridView.CurrentCell = cell; 
       cell.Selected = true; 
      } 
     } 
    } 
} 

bearbeiten

Sorry, ich habe versucht:

  • new Point(e.X, e.Y)
  • new Point(e.Location.X, e.Location.Y)
  • new Point(MousePosition.X, MousePosition.Y)
  • PointToClient(e.X, e.Y)
  • new Point(Cursor.Position.X, Cursor.Position.Y)
  • Control.MousePosition
  • Cursor.Position

und wahrscheinlich ein paar andere.

Edit 2

Dies ist, was ich damit meine Offset - einige der Lösungen verursachen diese in bestimmten Größenordnungen variieren Offset (einige wirklich weit weg usw.) - aber alle sind wie die von der Offset tatsächlicher Cursor.

enter image description here

bearbeiten 3

Mein contextCell ist ein new ContextMenu()

+0

Was meinst du mit Offset? Wie im Kontext erscheint nicht, wo der Cursor ist? – TheValyreanGroup

+0

Ich habe einen Screenshot bearbeitet :) Aber yeah - Offset vom Cursor ist –

+1

Wenn Sie einen ContextMenuStrip verwenden, versuchen Sie 'contextCell.Show (Cursor.Position);' – LarsTech

Antwort

2

Option 1: Die einfachste Lösung ein Kontextmenü für die Zeilen für die Ansicht das Kontextmenü RowTemplate.ContextMenuStrip Eigenschaft wird die Zuordnung von DataGridView:

dataGridView1.RowTemplate.ContextMenuStrip = contextMenuStrip1; 

Option 2: Auch wenn Sie die Zelle auszuwählen, bevor Sie die ContextMenuStrip zeigt, dann ist es genug CellContextMenuStripNeeded Ereignis zu behandeln:

private void dataGridView1_CellContextMenuStripNeeded(object sender, 
    DataGridViewCellContextMenuStripNeededEventArgs e) 
{ 
    if (e.RowIndex > -1 && e.ColumnIndex > -1) 
    { 
     dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     e.ContextMenuStrip = contextMenuStrip1; 
    } 
} 

Was ist Ihr Fehler war?

Sie berechnen die Mausposition auf der DataGridView falsch. Sie verwenden PointToClient was bedeutet this.PointToClient, während Sie die Methode der DataGridView, zum Beispiel verwenden müssen dataGridView1.PointToClient:

myContextMenu.Show(dataGridView1,dataGridView1.PointToClient(Cursor.Position)); 

Nur zu Ihrer Information Sie einfach ContextMenu mit diesem Code zeigen kann, und es gibt keine Notwendigkeit, ContextMenuStrip zu verwenden.

Aber ich empfehle Ihnen dringend, ContextMenuStrip zu verwenden.

0

Die Antwort war contextCell eine ContextMenuStrip anstelle der ContextMenu es war.

Danach alle ........

Danke für Antworten.

+0

Ich habe beschrieben, was dein Fehler war. Lies es in der Antwort:) –

+0

Yeah cool thank-- die PointToClient-Methode war nur eine der Möglichkeiten, die ich versuchte - ziemlich sicher, jede Methode, die ich lol könnte - aber die Antwort war nur ein ContextMenuStrip anstelle von ContextMenu und fügen Sie diese ContextMenuStrip an die DataGridView und dann musste ich nicht einmal seinen Standort festlegen - es funktionierte sofort gut :) –

+0

Es scheint, dass Sie nicht unter Steh, was ich in der Antwort gesagt habe. Sie können auch ein 'ContextMenu' anzeigen. Aber Sie sollten die richtige Position verwenden. Ihr Fehler war nur falsche Position übergeben.Natürlich können Sie auch ein 'ContextMenu' anzeigen und ein' ContextMenuStrip' ist kein Muss! –

1

oder

this.dataGridView1.ContextMenuStrip = this.contextMenuStrip1; 

und handhaben die DataGridView.CellContextMenuStripNeededEvent