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:
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
Die Meldung sieht dann wie folgt aus:
Der Fehler tritt tatsächlich nur auf, wenn auf irgendeiner Child-Form ein
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?!
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:
VB.NET-Quellcode
- ''' <summary> Erweitertes Error-Handling für DataGridView </summary>
- Public Sub DgvErrorHandling(sender As Object, e As DataGridViewDataErrorEventArgs)
- Dim dgv = DirectCast(sender, DataGridView)
- If Not e.ColumnIndex = -1 Then
- Dim comboCol = TryCast(dgv.Columns(e.ColumnIndex), DataGridViewComboBoxColumn)
- If comboCol IsNot Nothing AndAlso e.Context = (DataGridViewDataErrorContexts.Formatting Or DataGridViewDataErrorContexts.Display) _
- AndAlso TypeOf e.Exception Is ArgumentException Then
- Dim bsPK = DirectCast(comboCol.DataSource, BindingSource)
- If bsPK Is Nothing Then
- Throw New Exception($"{dgv.Name}: FEHLER! Sind alle Bindingsources auf Comboboxen gesetzt?")
- Return
- End If
- Dim tbPK = bsPK.DataTable
- Dim defaultRow = tbPK.Rows.Cast(Of DataRow).FirstOrDefault(Function(rw) 0 = (rw.RowState And (DataRowState.Deleted Or DataRowState.Detached)))
- If defaultRow.NotNull Then
- dgv(e.ColumnIndex, e.RowIndex).Value = defaultRow(comboCol.ValueMember) ' gültigen PK-Wert einsetzen
- Return
- End If
- End If
- End If
- Msg("ColumnIndex: ", e.ColumnIndex, ", Context: ", e.Context, Lf, e.Exception.Message)
- 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!"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"