Ich habe eine Datagrid-Ansicht in einer .NET-Winform-App. Ich möchte mit der rechten Maustaste auf eine Zeile klicken und ein Menü anzeigen lassen. Dann möchte ich Dinge wie Kopieren, Validieren usw. Auswählen
Wie mache ich A) ein Menü-Popup B) finde heraus, auf welche Zeile mit der rechten Maustaste geklickt wurde. Ich weiß, dass ich selectedIndex verwenden könnte, aber ich sollte in der Lage sein, mit der rechten Maustaste zu klicken, ohne die Auswahl zu ändern. Im Moment könnte ich den ausgewählten Index verwenden, aber wenn es eine Möglichkeit gibt, die Daten abzurufen, ohne die Auswahl zu ändern, wäre dies nützlich.
m.Show(dataGridView1.PointToScreen(e.Location));
Obwohl diese Frage alt ist, sind die Antworten nicht richtig. Kontextmenüs haben ihre eigenen Ereignisse in DataGridView. Es gibt ein Ereignis für das Zeilenkontextmenü und das Zellenkontextmenü.
Der Grund, warum diese Antworten nicht richtig sind, ist, dass sie keine unterschiedlichen Betriebsschemata berücksichtigen. Eingabehilfen, Remoteverbindungen oder Metro / Mono / Web / WPF-Portierung funktionieren möglicherweise nicht und Tastaturkürzel schlagen fehl (Umschalt + F10 oder Kontextmenütaste).
Die Zellenauswahl per Rechtsklick muss manuell erfolgen. Das Anzeigen des Kontextmenüs muss nicht behandelt werden, da dies von der Benutzeroberfläche erledigt wird.
Dies ahmt den von Microsoft Excel verwendeten Ansatz vollständig nach. Wenn eine Zelle Teil eines ausgewählten Bereichs ist, ändert sich die Zellenauswahl nicht und auch nicht
CurrentCell
. Ist dies nicht der Fall, wird der alte Bereich gelöscht und die Zelle ausgewählt und wirdCurrentCell
.Wenn Sie sich nicht sicher sind,
CurrentCell
hat die Tastatur beim Drücken der Pfeiltasten den Fokus.Selected
ist, ob es ein Teil von istSelectedCells
. Das Kontextmenü wird beim Klicken mit der rechten Maustaste angezeigt, wie es von der Benutzeroberfläche verarbeitet wird.Tastaturkürzel zeigen standardmäßig nicht das Kontextmenü an, daher müssen wir sie hinzufügen.
Ich habe diesen Code überarbeitet, damit er statisch funktioniert, sodass Sie ihn kopieren und in jedes Ereignis einfügen können.
Der Schlüssel ist zu verwenden,
CellContextMenuStripNeeded
da dies Ihnen das Kontextmenü gibt.In diesem Beispiel
CellContextMenuStripNeeded
können Sie angeben, welches Kontextmenü angezeigt werden soll, wenn Sie unterschiedliche Zeilen pro Zeile verwenden möchten.In diesem Zusammenhang
MultiSelect
istTrue
undSelectionMode
istFullRowSelect
. Dies ist nur ein Beispiel und keine Einschränkung.quelle
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Verwenden Sie das
CellMouseDown
Ereignis auf derDataGridView
. Anhand der Event-Handler-Argumente können Sie bestimmen, auf welche Zelle geklickt wurde. Mit derPointToClient()
Methode in DataGridView können Sie die relative Position des Zeigers auf DataGridView bestimmen, um das Menü an der richtigen Stelle aufzurufen.(Der
DataGridViewCellMouseEvent
Parameter gibt nur dasX
undY
relativ zu der Zelle an, auf die Sie geklickt haben. Dies ist nicht so einfach, um das Kontextmenü aufzurufen.)Dies ist der Code, mit dem ich die Mausposition ermittelt und dann die Position von DataGridView angepasst habe:
Der gesamte Event-Handler sieht folgendermaßen aus:
quelle
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
einen einfacheren Aufruf der Zelle verwenden.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Ich glaube, das
e.RowIndex
ist es, wonach Sie fragen.Vorschlag: Wenn der Benutzer ein Ereignis auslöst
CellContextMenuStripNeeded
, verwendene.RowIndex
Sie diese Option, um Daten aus Ihrem Raster abzurufen, z. B. die ID. Speichern Sie die ID als Tag-Element des Menüereignisses.Wenn der Benutzer nun tatsächlich auf Ihren Menüpunkt klickt, verwenden Sie die Sender-Eigenschaft, um das Tag abzurufen. Verwenden Sie das Tag mit Ihrer ID, um die gewünschte Aktion auszuführen.
quelle
CellContextMenuStripNeeded
Ereignishandlers tunif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
Dies bedeutet, dass das Menü nur angezeigt wird, wenn Sie mit der rechten Maustaste auf eine gültige Zeile klicken (dh nicht auf eine Überschrift oder einen leeren Rasterbereich)CellContextMenuStripNeeded
nur, wenn Ihr DGV an eine Datenquelle gebunden ist oder wenn sein VirtualMode auf true gesetzt ist. In anderen Fällen müssen Sie dieses Tag imCellMouseDown
Ereignis festlegen . Um dort auf der sicheren Seite zu sein, führen SieDataGridView.HitTestInfo
im MouseDown-Ereignishandler eine Überprüfung durch , um zu überprüfen, ob Sie sich in einer Zelle befinden.Ziehen Sie einfach eine ContextMenu- oder ContextMenuStrip-Komponente in Ihr Formular, entwerfen Sie sie visuell und weisen Sie sie dann der ContextMenu- oder ContextMenuStrip-Eigenschaft Ihres gewünschten Steuerelements zu.
quelle
Folge den Schritten:
Erstellen Sie ein Kontextmenü wie:
Der Benutzer muss mit der rechten Maustaste auf die Zeile klicken, um dieses Menü aufzurufen. Wir müssen das _MouseClick-Ereignis und das _CellMouseDown-Ereignis behandeln.
selectedBiodataid ist die Variable, die die ausgewählten Zeileninformationen enthält.
Hier ist der Code:
und die Ausgabe wäre:
quelle
Für die Position für das Kontextmenü stellte y das Problem fest, dass es relativ zur DataGridView benötigt wurde, und das Ereignis, das ich verwenden musste, gibt die Position relativ zur angeklickten Zelle an. Ich habe keine bessere Lösung gefunden, deshalb habe ich diese Funktion in der Commons-Klasse implementiert und rufe sie von jedem Ort aus auf, an dem ich sie benötige.
Es ist ziemlich getestet und funktioniert gut. Ich hoffe, Sie finden es nützlich.
quelle