Fragensteller
DataGridView Zeileneingabe mit Escape beenden

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
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- Bearbeitet Ionut DumaModerator Dienstag, 9. Oktober 2012 08:24
-
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
-
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
-
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
-
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 TauschekPrivate 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
-
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.
-
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
- Bearbeitet Christian Tauschek Sonntag, 14. Oktober 2012 08:45