Kontextmenü für gebundenes DGV

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Kontextmenü für gebundenes DGV

    Hallo ihr lieben
    Ich habe mir ein Contextmenü für ein DGV erstellt. Dieses hat die Einträge "neu" und "kopieren".
    Das DGV ist dabei an eine DataTable gebunden.

    Da ich mit einem rechtsklick ins DGV ja keine Selektierung im DGV ändern kann, muss ich erst linksklicken, und dann rechtsklicken,um die gewollte Datarow zu selektieren, bevor der kopieren Eintrage Sinn macht.
    Dazu habe ich folgendes gefunden:

    VB.NET-Quellcode

    1. Private Sub ArticleDataGridView_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles ArticleDataGridView.CellMouseDown
    2. ArticleDataGridView.ClearSelection()
    3. ArticleDataGridView.Rows(e.RowIndex).Selected = True
    4. End Sub

    Dieser Code selektiert mir die gesamte Zeile im DGV nach einem rechtsklick. Aber sie ändert nicht das Current der dazugehörigen DataTable.
    Wenn also der Eintrag in der 1. Zeile des DGV angewählt ist und ich klicke in die 2. Zeile, wird diese zwar selektiert, aber mein kopieren Kontextmenü Eintrag, kopiert mir den Wert der 1. Zeile.

    Wie bekomme ich dieses Problem behoben?
    Hmm
    Mit fällt aber nicht ein wie.
    Also nur über den row.Index, aber das scheint mir Müll.

    Edit: Ich habe mich erinnert, dass ich mal was ähnliches mit meinem Fischeprogramm hatte:
    DataSet - das Bindingsource.Current manuell setzen - Sonstige Problemstellungen - VB-Paradise 2.0 — Die große Visual–Basic– und .NET–Community

    Aber leider wars doch anders :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()

    Und damit das DGV auch die Anzeige richtig gestaltet:

    VB.NET-Quellcode

    1. Private Sub DeinDGV_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DeinDGV.CellMouseUp
    2. If e.RowIndex < 0 OrElse e.ColumnIndex < 0 OrElse DeinDGV.Rows(e.RowIndex).Cells(e.ColumnIndex).Selected Then Return
    3. DeinDGV.ClearSelection()
    4. DeinDGV.Rows(e.RowIndex).Cells(e.ColumnIndex).Selected = True
    5. DeineBindingSource.Position = e.RowIndex
    6. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich danke dir. Die Idee hatte ich auch, aber ich habe sie (ohne zu testen) verworfen, weil die BS.Position und der e.RowIndex ja nicht übereinstimmen, wenn ich nach dem Filtern der BindingSource die "BSArticleFiltered" anstelle der "BSArticle" verwende. Aber dafür habe ich eine Lösung eingebaut.
    Außerdem habe ich den Code für alle DGVs verwendbar gemacht. Alles funktioniert - also nur der Vollständigkeit halber:

    VB.NET-Quellcode

    1. Private Sub DGV_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles ArticleDataGridView.CellMouseUp, DTAddressbookDataGridView.CellMouseUp
    2. Dim klickedDGV = DirectCast(sender, DataGridView)
    3. With klickedDGV
    4. If e.RowIndex < 0 OrElse e.ColumnIndex < 0 OrElse .Rows(e.RowIndex).Cells(e.ColumnIndex).Selected Then Return
    5. .ClearSelection()
    6. .Rows(e.RowIndex).Cells(e.ColumnIndex).Selected = True
    7. Dim Source = DirectCast(.DataSource, BindingSource)
    8. Source.Position = e.RowIndex
    9. End With
    10. End Sub