none
DataGridView Zeileneingabe mit Escape beenden RRS feed

  • Frage

  • Hallo Leute,
    ich habe ein Problem, wenn ich die Eingabe von Daten in einer neuen Zeile mittels Escape beenden möchte. Dabei wird mir der Fehler 'Index 1.. hat keinen Wert' ausgegeben, wenn der User die Eingabe mit Escape abbricht.

    Komischerweise habe ich den Fehler nur auf meinem Win7-Entwicklungsrechner. Auf dem Zielrechner mit WinXP tritt das Problem nicht auf.

    Kann mir dabei jemand weiterhelfen?

        Private Sub dgv_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgv.RowValidating
            With CType(sender, DataGridView)
    
                Dim MK As cMeineKlasse = DirectCast(.CurrentRow.DataBoundItem, cMeineKlasse)    'hier wird der Fehler ausgelöst
    
                '....
    
            End With
        End Sub

    Vielen Dank im Voraus
    Christian Tauschek


    Christian Tauschek

    Samstag, 6. Oktober 2012 09:31

Alle Antworten

  • Hallo Christian,

    Ich denke der Fehler hat etwas mit DirectCast zu tun. Vielleicht wenn Du die Zeileneingabe beendest besteht keine Vererbungsbeziehung zwischen dem Laufzeittyp cMeineKlasse und der DataBoundItem

    Grüße,
    Ionut


    Dienstag, 9. Oktober 2012 08:23
    Moderator
  • Hallo Christian,

    in dem Falle wird CurrentRow keinen Wert haben (Nothing). Ergänze den Code um:

       With CType(sender, DataGridView)
            If .CurrentRow IsNot Nothing Then
                Dim MK As cMeineKlasse = DirectCast(.CurrentRow.DataBoundItem, cMeineKlasse)
            Else
               ' ... rausspringen oder was anderes sinnvolles
            EndIf
       End With

    Gruß Elmar

    Dienstag, 9. Oktober 2012 09:13
    Beantworter
  • Hallo Elmar,
    schon die Abfrage auf ".CurrentRow IsNot Nothing" löst den Fehler aus.
    Nothing als Rückgabewert wäre ja ok. Es macht auch keinen Unterschied, ob ich TryCast oder DirectCast verwende.
    Verwirrend ist für mich jedenfalls, dass der Fehler bei meinem Win7 Rechner auftritt und bei einem XP-Rechner nicht.

    Ich habe das Ganze vorerst auf die "harte Tour" gelöst. Damit funktioniert es auch aber schön ist das natürlich nicht.

            Try
                Return TryCast(.CurrentRow.DataBoundItem, cMeineKlasse)
            Catch ex As Exception
                Return Nothing     
    End Try

    mfg
    Christian Tauschek


    Christian Tauschek

    Dienstag, 9. Oktober 2012 16:43
  • Hallo Christian,

    um welches Ereignis handelt es sich?

    Zunächst würde ich den Code um weitere Tests aufbohren:

        dim mk As cMeineKlasse = Nothing
        Dim grid = TryCast(sender, DataGridView)
        if grid AndAlso grid.CurrentCell IsNot Nothing then
            dim row = grid.CurrentRow
            If row IsNot Nothing AndAlso row.DataBoundItem IsNot Nothing Then
                mk = TryCast(sender, cMeineKlasse)
            End If
        end If
        If mk isNot Nothing Then
            ...
        End If

    und später wieder zurückbauen. Die "Nothings" könnte man dazu im Else Zweig protokollieren.

    Gruß Elmar

    Dienstag, 9. Oktober 2012 17:31
    Beantworter

  • Hallo Elmar,
    ich habe deinen Vorschlag in etwas geänderter Form in meinem Code eingebaut.
    Jedoch tritt der Fehler immer noch in der selben Zeile auf. Siehe Code.
    mfg
    Christian Tauschek

        Private Sub dgv_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.RowValidated
            With CType(sender, DataGridView)
                Dim MB As cBestellung
                If CType(sender, DataGridView) IsNot Nothing AndAlso Not .CurrentRow.IsNewRow AndAlso .CurrentRow IsNot Nothing AndAlso .CurrentCell IsNot Nothing Then
                    If .CurrentRow.DataBoundItem IsNot Nothing Then 'Fehler: der Index X hat keinen Wert
                        MB = TryCast(.CurrentRow.DataBoundItem, cBestellung)
                    End If
                End If
            End With
        End Sub



    Christian Tauschek

    Mittwoch, 10. Oktober 2012 18:47
  • Hi zusammen.

    Was mir so spontan einfällt bei dem Code wäre mal zu prüfen, welchen Wert CType(sender, DataGridView) und die CurrentRow im konkreten Fall hat. Wenn dort beispielsweise etwas anderes konstruiert wird als nur die 2 Optionen "mein erwartetes Objekt" oder "nothing", zum Bleistift ein leeres neues oder ein anderes Objekt, dann würde das erklären, wieso die ganzen "AndAlso"s brav durchlaufen, allerdings dann beim DataBinding Fehler auftreten.

    Was bringt schrittweises Debuggen (F9 etc.)?

    LG, Dennis.

    Freitag, 12. Oktober 2012 10:09
  • Hallo,
    ich habe den Fehler mal schrittweise im untenstehenden Testcode gesucht.
    Im Objekt 'CType(sender, DataGridView)' befindet sich das richtige Objekt (DataGridView).
    Gehe ich mit der Maus im Debugmodus über '.CurrentRow', dann wird mir zwar korrekt angezeigt, dass es sich um eine DataGridViewRow handelt. Aber wenn ich mir diese Eigenschaften anschauen möchte indem ich die Maus auf das '+' bewege, dann kracht es auch beim Debugger und ich bekomme die Fehlermeldung Index X hat keinen Wert. (Fehler bei der Eigenschaftsauswertung)

    mfg
    Christian Tauschek
        Private Sub dgv_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.RowValidated
            With CType(sender, DataGridView)
                Dim MB As cBestellung
                If CType(sender, DataGridView) IsNot Nothing AndAlso Not .CurrentRow.IsNewRow AndAlso .CurrentRow IsNot Nothing AndAlso .CurrentCell IsNot Nothing Then
                    If .CurrentRow.DataBoundItem IsNot Nothing Then 'Fehler: der Index X hat keinen Wert
                        MB = TryCast(.CurrentRow.DataBoundItem, cBestellung)
                    End If
                End If
            End With
        End Sub


    Christian Tauschek


    Sonntag, 14. Oktober 2012 08:44