Fehler beim Laden von Child-Forms, wenn vorher auf anderer Child-Form ein DataGridViewErrorEventArg ausgelöst wurde

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

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

    Fehler beim Laden von Child-Forms, wenn vorher auf anderer Child-Form ein DataGridViewErrorEventArg ausgelöst wurde

    Hallo zusammen.
    Ich arbeite mit Mdi, seit Kurzem (könnte mit dem "Upgrade" auf .Net-Framework 4.7.2" zusammenhängen oder ich habe es nie mitbekommen) erhalte ich ab und an eine seltsame Fehlermeldung und das ChildForm wird nicht richtig geladen:

    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

    ************** Ausnahmetext **************
    System.IndexOutOfRangeException: Der Index -1 hat keinen Wert.
    bei System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
    bei System.Windows.Forms.CurrencyManager.get_Current()
    bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
    bei System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
    bei System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
    bei System.Windows.Forms.DataGridView.SetAndSelectCurrentCellAddress(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick, Boolean clearSelection, Boolean forceCurrentCellSelection)
    bei System.Windows.Forms.DataGridView.MakeFirstDisplayedCellCurrentCell(Boolean includeNewRow)
    bei System.Windows.Forms.DataGridView.OnEnter(EventArgs e)
    bei System.Windows.Forms.Control.NotifyEnter()
    bei System.Windows.Forms.ContainerControl.UpdateFocusedControl()


    Ich konnte den Fehler gerade reproduzieren - ist ein wenig komplex:
    In z.B. meiner frmStandort (normales Child-Form mit DataGridView) möchte ich einen Datensatz löschen, das geht nicht weil der Standort sich noch in untergeordneten Tabellen befindet und keine Löschweitergabe eingerichtet ist (absichtlich!).
    Sämtliche Fehler im DataGridView werden über eine Methode abgefangen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary> Erweitertes Error-Handling für DataGridView </summary>
    2. Public Sub DgvErrorHandling(sender As Object, e As DataGridViewDataErrorEventArgs)
    3. Dim dgv = DirectCast(sender, DataGridView)
    4. If Not e.ColumnIndex = -1 Then
    5. Dim comboCol = TryCast(dgv.Columns(e.ColumnIndex), DataGridViewComboBoxColumn)
    6. If comboCol IsNot Nothing AndAlso e.Context = (DataGridViewDataErrorContexts.Formatting Or DataGridViewDataErrorContexts.Display) _
    7. AndAlso TypeOf e.Exception Is ArgumentException Then
    8. Dim bsPK = DirectCast(comboCol.DataSource, BindingSource)
    9. If bsPK Is Nothing Then
    10. Throw New Exception($"{dgv.Name}: FEHLER! Sind alle Bindingsources auf Comboboxen gesetzt?")
    11. Return
    12. End If
    13. Dim tbPK = bsPK.DataTable
    14. Dim defaultRow = tbPK.Rows.Cast(Of DataRow).FirstOrDefault(Function(rw) 0 = (rw.RowState And (DataRowState.Deleted Or DataRowState.Detached)))
    15. If defaultRow.NotNull Then
    16. dgv(e.ColumnIndex, e.RowIndex).Value = defaultRow(comboCol.ValueMember) ' gültigen PK-Wert einsetzen
    17. Return
    18. End If
    19. End If
    20. End If
    21. Msg("ColumnIndex: ", e.ColumnIndex, ", Context: ", e.Context, Lf, e.Exception.Message)
    22. End Sub


    Die Meldung sieht dann wie folgt aus:


    Der Fehler tritt tatsächlich nur auf, wenn auf irgendeiner Child-Form ein DataGridViewErrorEventArg ausgelöst wurde. Wurde das nicht ausgelöst, kann ich die Forms ganz normal wie gewohnt öffnen.
    Ich muss auch dann tatsächlich die komplette Anwendung neu starten, sonst macht er mir den Fehler bei jeder Child-Form, wo ein DataGridView drauf sitzt - außer auf der Form, wo der Fehler aufgelaufen ist, die kann ich wieder ganz normal öffnen ?(

    Habt ihr eine Idee, wie ich das umgehen kann? Sieht ja so aus, als würde der ColumnIndex -1 irgendwie gemerkt werden?!
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    wenn auf irgendeiner Child-Form ein DataGridViewErrorEventArg ausgelöst wurde.
    Stop. In diesem Zusammenhang kann ein Event ausgelöst werden. Aber DataGridViewErrorEventArg ist ein Event-assoziiertes Parameterdatenpaket. Daher: Welches Event wird ausgelöst? Denn dieses EventArgs-Derivat kennt die von mir benutzte Suchmaschine nicht. Scheint also kein Framework-EventArgument-Typ zu sein.
    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.
    @VaporiZed:
    Ich hoffe, ich hab dich richtig verstanden:



    Der Handler ist in dem Falle dgv.DataError und scheint auch nix aus den Helpers vom @ErfinderDesRades zu sein...
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich kenn bisher DataErrors, wenn Daten in ComboBox-Zellen geschrieben werden, deren Wert dann zu einem nichtexistenten Eintrag führen. Beispiel:
    Die DGV-Spalte 1, eine ComboBox-Spalte, ist an die CategoryID einer DataTable gebunden. Wäre die Spalte eine TextBox-Spalte, würden die Werte -1, -2 oder -3 angezeigt werden. Nun wird aber nicht diese ID angezeigt, sondern Dank komplexem DataBinding statt der ID die Bezeichnung der Category. Dazu muss natürlich eine DataSource für die ComboBox-Spalte angegeben werden. Wird nun aber eine -4 als ID angegeben oder ist die benötigte BS noch ohne die passende Datenquelle, kommt ein DataError dabei raus.
    Aber irgendwie wird mir grad nicht klar, was Dein Begehren ist. Fehler abfangen? Ursache finden? Was ganz anderes?
    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.

    VaporiZed schrieb:

    Ursache finden?

    Ursache finden.. mir ist nicht klar, warum er bei anderen Forms Probleme mit einem Index -1 macht, wenn auf frmStandort eine InvalidConstraintException auftritt.

    Fehler abfangen: Das hab ich nun mit einer schöneren Messagebox behandelt. Also wenn eine InvalidConstraintException auftritt, dann kann das mit einer
    Nachricht dargestellt werden - aber darum geht's nicht.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Wenn ich mir die Meldung aus Post#1 anschaue, dann steht doch da, dass auf eine Spalte mit dem Index -1 zugegriffen werden soll. An dieser Stelle würd ich ansetzen und schauen: Was steht (inzwischen) in der DataSource? Woher kommt die -1? Sind keine Daten geladen? Wurden doch Daten gelöscht? Eine -1 hat bei einem DGVCell-Auswahlversuch nix verloren.
    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.

    VaporiZed schrieb:

    An dieser Stelle würd ich ansetzen und schauen


    Jo, muss ich mir mal anschauen wie ich das anstelle. Mich wundert halt, dass das nur auftritt nachdem ein Löschversuch fehlgeschlagen ist. Und die Form die ich dann öffnen möchte hat mit der Tabelle, wo der Löschversuch fehlgeschlagen ist, überhaupt nichts zu tun..
    Sehr merkwürdig
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    wirkliche Idee habich auch nicht.
    Vermutlich muss man eine kleine Anwendung bauen, die den Fehler reproduziert.
    Einen Haucch eines Ansatzes kam mir neulich: Vielleicht kann man mit BindingSouce.ResetBinding iwas wiederherstellen, was da beim gescheiterten Löschen vielleicht kaputt gegangen ist in der Databinding-Infrastruktur.
    @ErfinderDesRades
    Testprojekt hab ich erstellt - auch mit meinen Helpers, Mdi-Kram usw. - der Fehler lässt sich nicht reproduzieren.
    Weder DataSetOnly, noch mit MySQL-Datenbank - jetzt bin ich ratlos...
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Wenn es nicht aufbauend geht, dann eben abbauend. Nimm eine Kopie Deines Projektes, teste, ob der Fehler kommt, und filettiere es solange, bis alles weg ist, was nicht für das immer noch fehlerproduzierende Testprojekt relevant ist.
    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.