Sub CellMouseEnter des DataGridViews aufrufen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Pry.

    Sub CellMouseEnter des DataGridViews aufrufen

    Hi,

    ich möchte aus der Sub CellMouseClick eines DataGridView die Sub CellMouseEnter aufrufen.
    Leider klappt die Methode mit der ich es versucht habe nicht:

    VB.NET-Quellcode

    1. dgvRules_CellMouseEnter(dgvRules, New System.Windows.Forms.DataGridViewCellEventArgs)

    Zum Hintergrund: In meinem DGV werden die Zellen markiert, wenn CellMouseEnter ausgelöst wird. Mit einem Klick lösche ich die entsprechende Zeile. Wenn ich nun eine Zeile über den Klick löchen, steht der Mauszeiger unter Umständen über einer anderen Zeile, welche jedoch nicht markiert wird, weil CellMouseEnter nicht ausgelöst wurde, daher möchte ich es über den genannten Aufruf antriggern, was jedoch nicht geht.

    Wie müsste der Aufruf korrekt heißen?
    Bei meiner Variante erhalte ich folgende Fehler:
    • Fehler 1 - Für den Parameter "columnIndex" von "Public Sub New(columnIndex As Integer, rowIndex As Integer)" wurde kein Argument angegeben.
    • Fehler 2 - Für den Parameter "rowIndex" von "Public Sub New(columnIndex As Integer, rowIndex As Integer)" wurde kein Argument angegeben.

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Hi Bernd (mal wieder :)),

    also meine CellMouseEnter-Event sieht so aus:

    VB.NET-Quellcode

    1. Private Sub dgvRules_CellMouseEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRules.CellMouseEnter
    2. dgvRules.Focus()
    3. If Not e.RowIndex < 0 Then
    4. dgvRules.Item(2, e.RowIndex).Value = My.Resources.RuleRemove
    5. dgvRules.Rows.Item(e.RowIndex).Selected = True
    6. End If
    7. End Sub

    Das heißt also, dass eine Zeile immer markiert wird, wenn die Maus draufzeigt. Das dazugehörige Leave-Event gibt es auch, aber ist an dieser Stelle irrelevant.

    Nun kommt das CellMouseClick-Event dazu:

    VB.NET-Quellcode

    1. Private Sub dgvRules_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRules.CellClick
    2. If Not e.RowIndex < 0 Then
    3. If e.ColumnIndex = 2 Then
    4. dgvRules.Rows.RemoveAt(e.RowIndex)
    5. If Not e.RowIndex = dgvRules.Rows.Count Then
    6. 'dgvRules_CellMouseEnter(dgvRules, ?)
    7. Else
    8. dgvRules.ClearSelection()
    9. End If
    10. Else
    11. dgvRules.Item(0, e.RowIndex).Value = Not dgvRules.Item(0, e.RowIndex).Value
    12. End If
    13. End If
    14. End Sub

    Wenn ich also auf eine Zeile (Spalte 2) klicke, wird die Zeile gelöscht. Dabei "rutschen" die Zeilen, welche dahinter kommen bekanntlich nach. Das bedeutet, dass der Mauszeiger auf der nächsten Zeile steht, welche jedoch nicht automatisch markiert wird. Daher möchte ich auch das Enter-Event auslösen. Wenn die gelöschte Zeile die letzte Zeile im DGV ist, wird die Selektion aufgehoben.

    Ich hoffe das reicht dir :)

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%

    Pry schrieb:

    dgvRules.Item(0, e.RowIndex).Value = Not dgvRules.Item(0, e.RowIndex).Value


    Option Strict On lässt keine Operanden des Typs "Objekt" für den Not-Operator zu.


    Das ist die Fehlermeldung.

    du hast vermutlich Option Strict On nicht an.

    So vieleicht !

    VB.NET-Quellcode

    1. If Not e.RowIndex < 0 Then
    2. If e.ColumnIndex = 2 Then
    3. DataGridView1.Rows.RemoveAt(e.RowIndex)
    4. If Not e.RowIndex = DataGridView1.Rows.Count Then
    5. 'dgvRules_CellMouseEnter(dgvRules, ?)
    6. Else
    7. DataGridView1.ClearSelection()
    8. End If
    9. Else
    10. Dim MeinErster As String = CStr(DataGridView1.Item(0, e.RowIndex).Value)
    11. Dim MeinZweiter As String = CStr(DataGridView1.Item(0, e.RowIndex).Value)
    12. ' Jetzt abfragen was du erreichen woltest
    13. If MeinErster <> MeinZweiter Then
    14. End If
    15. End If
    16. End If


    Damit fragst du ja den Value der Celle (Das was drin steht ) ab

    VB.NET-Quellcode

    1. Dim MeinErster As String = CStr(DataGridView1.Item(0, e.RowIndex).Value)

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

    Hi Bernd,

    sorry, aber ich muss dich leider enttäuschen. Das was du "entdeckt" hast, ist vielleicht ein Schönheitsfehler, das gebe ich zu, aber das ist nicht das Problem, welches ich habe :)
    es geht mir viel mehr um diesen Abschnitt:

    VB.NET-Quellcode

    1. Private Sub dgvRules_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRules.CellClick
    2. If Not e.RowIndex < 0 Then
    3. If e.ColumnIndex = 2 Then
    4. dgvRules.Rows.RemoveAt(e.RowIndex)
    5. If Not e.RowIndex = dgvRules.Rows.Count Then
    6. dgvRules_CellMouseEnter(dgvRules, ?) 'Hier bitte schauen :)
    7. 'Dieser Punkt ist mein Problem. Hier möchte ich nämlich das CellMouseEnter-Event
    8. 'aufrufen, aber ich weiß halt nicht wie, sprich was anstelle des Fragezeichens stehen muss?!
    9. Else
    10. '...
    11. End If
    12. Else
    13. '...
    14. End If
    15. End If
    16. End Sub

    Ich hoffe das ist jetzt eindeutiger. Siehe Kommentar.

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%

    ChaosBernd schrieb:

    Pry schrieb:

    dgvRules_CellMouseEnter(dgvRules, ?)

    VB.NET-Quellcode

    1. dgvRules_CellMouseEnter(dgvRules, Nothing)


    oder versuch mal das e mitzugeben.

    Beides erfolglos schon versucht. Nothing bringt dabei gar nichts, weil ich dann in dem Enter-Event keine Daten zum auswerten habe. Wenn ich "e" mitgebe, habe ich nur die Row- und Column-Werte aus dem Click-Event, welche nicht passen. Er muss die Werte quasi "neu" ermitteln... nur wie? :) Viel Spass beim Training!

    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Jetzt sitze ich auf dem Schlauch.

    Ich weis nun selber nicht wie du das e mitgeben kannst.
    Hatte ich noch nie.
    Aber vieleicht ist Mike oder so Online und kann dir helfen.

    Was ist wenn du dir das e in Varaible speicherst, dann mit gibst.


    sorry
    jetzt aber
    Mittlerweile habe ich das erreicht, was ich brauchte. Leider nicht über den Weg, welcher hier beschrieben ist, aber über einen anderen Umweg - und dieser ist schon bissl mehr als ein Schöhnheitsfehler. :)
    Vielleicht hat ja dennoch jemand eine Idee, wie ich das oben beschriebene realisieren kann.

    Bernd, danke trotzdem!

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%
    Klar, sollst du bekommen :) Ich habe aber ein wenig "rumgetrickst". Das Problem, was sich darstellte, lässt sich irgendwie schwer erklären. Es trat nur auf, wenn der DGV ein Scrollbar (vertikal) hatte und ich eine Zeile gelöscht habe. Mit der Variante, bei der nur "e" übergeben wurde klappte eigentlich alles, nur eine Sache: Die Scrollbar war nach ganz unten gescrollt, sprich maximaler Offset, dann wurde die genannte Zeile (jedoch nicht die letzte) gelöscht. Wenn es nun der Fall eintrat, dass nach der Löschung die ScrollBar verschwindet (weil nicht gebraucht), wurde immer der falsche Eintrag markiert. Daher habe ich das nun letztlich so gemacht - was meines Erachtens auch mit der Aufruf des CellMouseEnter-Events funktioniert hätte, aber sei es drum:

    VB.NET-Quellcode

    1. Private Sub dgvRules_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRules.CellClick
    2. If Not e.RowIndex < 0 Then
    3. If e.ColumnIndex = 2 Then
    4. Dim ScrollOffset As Integer = dgvRules.VerticalScrollingOffset
    5. dgvRules.Rows.RemoveAt(e.RowIndex)
    6. If Not e.RowIndex = dgvRules.Rows.Count Then
    7. If (ScrollOffset > 0) And (dgvRules.VerticalScrollingOffset = 0) Then
    8. dgvRules_CellMouseEnter(dgvRules, e:=New DataGridViewCellEventArgs(e.ColumnIndex, e.RowIndex - 1))
    9. Else
    10. dgvRules_CellMouseEnter(dgvRules, e)
    11. End If
    12. Else
    13. If ScrollOffset = 0 Then
    14. dgvRules.ClearSelection()
    15. End If
    16. End If
    17. Else
    18. dgvRules.Item(0, e.RowIndex).Value = Not dgvRules.Item(0, e.RowIndex).Value
    19. End If
    20. End If
    21. End Sub


    Ich hoffe das war jetzt nicht zu wirr, muss mich aber beeilen, Freundin schimpft schon :D
    Wenn du noch Fragen / Anmerkungen hast, immer her damit.

    Viele Grüße,
    Pry
    Dateien umbenennen und nummerieren - nichts leichter als das!

    Basic File Renamer: 100%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pry“ ()