DGV mit Doppelklick auf Spaltenheader bringt Index-Fehler bei DGV.Rows-Abfrage

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Lord Luxor.

    DGV mit Doppelklick auf Spaltenheader bringt Index-Fehler bei DGV.Rows-Abfrage

    Hi,

    ich habe ein DateGridView und mit einem Doppelklick kann man den entsprechenden Datensatz zur weiteren Bearbeitung auswählen.
    Dazu lese ich aus der jeweiligen Zelle die Spalte 0 aus (verborgen) in der sich die ID des Datensatzes befindet.

    VB.NET-Quellcode

    1. cellrow = CInt(e.RowIndex)
    2. data_id = CStr(DGV_type.Rows(cellrow).Cells(0).Value)


    Komme ich dabei auf die Spaltenüberschriften, bekomme ich einen Index-Fehler:
    System.ArgumentOutOfRangeException: "Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
    Parametername: index"


    Kann ich auch nachvollziehen, im Header befindet sich kein ID-Wert, allerhöchstens die Spaltenbezeichnung "id".

    Über die Events bin ich nicht weitergekommen. Anscheinend kann ich da nicht selektiv ein Event auswählen, dass nur bei Datensätzen geworfen wird.

    Muss ich wirklich cellrow auf negative Werte prüfen und dann verzweigen? Oder gibt es doch einen eleganteren Weg?

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    @Lord Luxor Mach mal ein Minimalprojekt, das Deinen Effekt reproduziert und hänge es bereinigt und gezippt an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Welchen Wert hat e.RowIndex bzw. cellrow wenn du auf den Header Doppelklickst?

    Ggf. prüfen ob e.RowIndex negativ ist, so wie du es vermutet hast.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hi Rod,
    Hi mrMo

    mrMo schrieb:

    Welchen Wert hat e.RowIndex bzw. cellrow wenn du auf den Header Doppelklickst?

    Ggf. prüfen ob e.RowIndex negativ ist, so wie du es vermutet hast.


    Ja der Index (e.RowIndex) sagt -1, wenn man den Header doppelklickt. Anscheinend kann man den nicht bei den Ereignissen ausblenden.

    Hab das mal in ein eigenes Projekt gepackt. Ich hab das auf das Ereignis CellContentDoubleClick gesetzt, also das Wort "data" doppelklicken.
    Vor der Fehlermeldung wirft er noch den Index-Wert aus.

    Bye
    Markus
    Dateien
    • Dummy.zip

      (182,43 kB, 48 mal heruntergeladen, zuletzt: )
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    @Lord Luxor

    MSDN schrieb:

    Der Index der Zeile, die die Zelle enthält; -1, wenn keine übergeordnete Zeile vorhanden ist.
    Du hast keine Zeilen in Deinem DGV, Du klickst auf die Spalten-Überschrift.
    Mach einen Button und ein Label auf die Form und dann so:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DataGridView1_CellContentDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentDoubleClick
    3. Dim cellrow As Integer
    4. Dim data_id As String
    5. cellrow = CInt(e.RowIndex)
    6. Me.Label1.Text = "Index: " & cellrow
    7. If DataGridView1.Rows(cellrow).Cells(0).Value IsNot Nothing Then
    8. data_id = DataGridView1.Rows(cellrow).Cells(0).Value.ToString
    9. End If
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. Me.DataGridView1.Rows.Add()
    13. End Sub
    14. End Class
    Schreibe ertwas in die Zelle hinein und doppelklicke auf den Text, nicht aber auf den leeren Raum neben dem Text (das ist der Unterschied zwischen CellContentDoubleClick und CellDoubleClick). ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Dir. Aber der Unterschied der beiden Ereignisse war mir schon klar. Ich hatte mich nur beim Erstellen des Demos vertan ;)
    Und dass im Demo keine Daten drin sind, war wohl eher Faulheit. In meinem eigentlichen Programm wird das DGV durch eine DataTable gefüllt, da sind Datensätze drin. Solange ich auf die Datensätze klicke, funktioniert das soweit auch wie gewünscht, nur wenn man daneben klickt und den Spaltenheader erwischt, kommt als Index -1 raus.

    Gut, das habe ich jetzt verstanden, dass dem so ist und ich mich selbst darum kümmern muss, das abzufangen. Daher frage ich den Wert von e.RowIndex ab und wenn er größergleich 0 ist, dann lese ich die erste Zelle des Datensatzes aus. Ansonsten springt er aus der Sub raus ohne weiteres zu tun.

    Bye
    Markus

    Zitat entfernt. ~Thunderbolt
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

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

    Lord Luxor schrieb:

    dass dem so ist und ich mich selbst darum kümmern muss, das abzufangen.
    Ja, genau.
    Auf diese Weise unterscheidet man, ob auf einen Header geklickst wurde, oder i n den Daten-Bereich.
    MS hat es sich (leider) gespart, für diese verschiedenen Fälle jeweils ein eigenes Event zu implementieren.
    Eine Frage habe ich noch zu den Ereignissen des DGV. Was genau ist der Unterschied zwischen "CellDoubleClick" und "CellMouseDoubleClick".
    Die Beschreibung grenzt das nicht so wirklich voneinander ab. "... auf eine beliebige Stelle in einer Zelle doppelklickt"- "... auf eine Zelle innerhalb eines Datagridview doppelgeklickt wird."

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    @Lord Luxor Gugst Du hier: stackoverflow.com/questions/18…k-vs-cellmousedoubleclick

    stackoverflow schrieb:

    CellDoubleClick and CellClick are events that fire from the left mouse button, as well as "clicks" that come from tabbing to an item and hitting the spacebar, etc.
    MouseDoubleClick and MouseClick are from mouse clicks of any button.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!