Re: DataGridRowView.ContextMenuStrip



Hallo Elmar

Für das DataGridView habe allerdings derzeit noch nicht
viel Zeit gefunden.

Und je mehr man Zeit verwendet, desto weniger Code bleibt übrig...

Ich nehme an dass Microsoft das DataGridView entwickelt hat um es in
der eigenen Software zu benutzen.

Naja, eher um zumindest etwas zu bieten, was den kommerziellen
Produkten nahe kommt.

Im SQL Server Management Studio ist es mit Sicherheit verwendet worden.

Soweit ich das beurteilen kann wäre es am saubersten - gleiche
Ereignisbehandlung usw. - durch eine abgeleitetes DataGridView
hinzukriegen.
Aus dem simplen Grund, weil man nur so auf die protected
Methode "ProcessDeleteKey" Zugriff hat.
Das gilt auch für andere Tastatur-Befehle.

Der DeleteKey funktioniert ja ohne was zu programmieren. Und diesen aus dem
Kontextmenü aufrufen würde die CurrentRow löschen, die nicht mit der
indentisch sein muss wo die rechte Maustaste geklickt wird.



Dein zweites Beispiel funktioniert fast. Allerdings wird die Maus
zwei mal betätigt. Erst in der richtigen Cell die rechte Maustaste.
Dann muss man die Maus im Menü bewegen und über dem richtigen
Menüpunkt die linke Maustaste klicken. Und davon kommen die
Koordinaten. Die sind dann unter Umständen nicht mehr in der Cell.
Vielleicht in einer falschen Cell oder auch außerhalb vom Formular.

Das kann ich so nicht nachvollziehen.
Wobei ich hier zum Testen ein DataGridView mit Standardeinstellungen
verwendet habe.

Könntest Du das mal genauer beschreiben?

Man klickt zwei mal erst rechts dann links. Man braucht die Koordinaten vom
Rechtsklick, der Code hat aber die vom Linksklick. Die können -1 sein oder
von einer falschen Cell stammen je nachdem wo die Maus beim zweiten klicken
gerade steht.


Vom Einsatz via RowTemplate wird im übrigen abgeraten:
http://msdn2.microsoft.com/de-de/library/ha5xt0d9.aspx
Empfohlene Vorgehensweisen für das Skalieren des DataGridView-
Steuerelements in Windows Forms

Ich hatte das ans RowTemplate gehängt weil das Kontextmenü sonst innerhalb
des DGV auch aufgeht wo gar keine Row ist.

Der Link hat mich auf den Weg gebracht. Der Event RowContextMenuStripNeeded
ist der Schlüssel:

Shared Sub DataGridView_RowContextMenuStripNeeded(ByVal sender As Object,
ByVal e As
System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventArgs) _
Handles DataGridView1.RowContextMenuStripNeeded
Dim r As DataGridViewRow = DirectCast(sender,
DataGridView).Rows.Item(e.RowIndex)
If Not r.IsNewRow Then
e.ContextMenuStrip = New ContextMenuStrip
With e.ContextMenuStrip.Items.Add("löschen row " & r.Index, Nothing,
AddressOf ToolStripItem_DataGridViewRow_Remove)
.Tag = r
End With
End If
End Sub

Shared Sub ToolStripItem_DataGridViewRow_Remove(ByVal sender As Object,
ByVal e As System.EventArgs)
Dim r As DataGridViewRow = DirectCast(DirectCast(sender,
ToolStripItem).Tag, DataGridViewRow)
r.DataGridView.Rows.Remove(r)
End Sub


.