Re: DataGridRowView.ContextMenuStrip

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Hallo Lutz,

Lutz Elßner <www.vb-hosting.de> schrieb ...
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.

Die verwenden dort ein eigenes Grid - wie ich irgendwann
mal in Beta Zeiten reflektierte ;-)


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.

Deswegen vorher einstellen, CurrentCell beeinflusst auch CurrentRow.
Aber nur mit den Process Methoden kriegst Du ein identisches
Verhalten, so wird dort ebenfalls geprüft ob dem Benutzer das
Löschen erlaubt ist und die Datenquelle es ermöglicht usw. -
was Du sonst selbst prüfen müsstest.

Dein zweites Beispiel funktioniert fast. Allerdings wird die Maus
zwei mal betätigt.

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.

Bei mir nicht, egal wie ich das jetzt versucht habe.

Die können -1 sein oder von einer falschen Cell stammen je
nachdem wo die Maus beim zweiten klicken gerade steht.

Im Zweifelsfall immer einen HitTest ausführen.

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.

auch da wäre ein HitTest vorher das einfachste.

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

ich würds wie in Office machen und das Item anzeigen aber
deaktivieren, so bleiben die Positionen im Kontextmenü
gleich und der Anwender muss nicht immer erst suchen
(wenns später mehrere werden)


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)

Dann fallen einige Events aus.
Und sollte die Datenquelle mal kein Löschen erlauben gibts
einen Fehler

End Sub

Gruss
Elmar

.



Relevant Pages

  • Re: BindingNavigator AddNew DataRow
    ... Dim DT as DataTable ... und diese an das datagridview gehängt. ... Darin ist DGV.AllowUserToAddRows per Default auf True ... ByVal e As System.EventArgs _ ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Re: DataGridView Formatting and Filtering
    ... of a 2nd datagridview but this doubles the amount of code I have to right ... Private Sub Form1_Load(ByVal sender As System.Object, ... Dim i As Integer ... Microsoft Online Community Support ...
    (microsoft.public.dotnet.languages.vb)
  • Re: DataGridView und SelectedRows
    ... Private WithEvents DGV As DataGridView ... DGV = New DataGridView ... Dim DR As DataRow ... If DGV.SelectedRows.Count> 0 Then ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: DataGridView und SelectedRows
    ... Private WithEvents DGV As DataGridView ... DGV = New DataGridView ... Dim DR As DataRow ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • RE: Which DataGridViewRow?
    ... DataGridView, and find its corresponding row in the underlying data source, ... The other aspect of the issue is giving a specified row in the data source ... Dim dt As DataTable = New DataTable ...
    (microsoft.public.vsnet.general)