HelpersSmallEd von EDR - Fehler bei Erstellen eines neuen Datensatzes

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    HelpersSmallEd von EDR - Fehler bei Erstellen eines neuen Datensatzes

    Ich benutze zum Editieren von alten un neuen Datensätzen aus den HelpersSmallEd die Funktionen

    VB.NET-Quellcode

    1. BindingSource.EditCurrent(Of Form)
    2. und
    3. BindingSource.EditNew(Of Form)


    Form ist ein relativ komplexer Joining-View mit 7 LookUp-Tabellen in Combo-Boxen und 3 Child-Views als Datagridview.

    BindingSource.EditCurrent(Of Form) funktioniert einwandfrei.

    BindingSource.EditNew(Of Form) löst im Original-Quelltext von EDR jedoch in Zeile 12 eine Exception aus:

    VB.NET-Quellcode

    1. Private Sub EditItem(Of T As {Form, New})(bs As BindingSource, item As Object)
    2. Dim tb = DirectCast(item, DataRowView).Row.Table
    3. Using frm = New T
    4. tb.DataSet.Register(frm, False)
    5. Dim allCtls = New GetChilds(Of Control)(Function(ctl) ctl.Controls).AllAsList(frm)
    6. Dim bindFlags As BindingFlags = BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.GetField
    7. For Each ctl In allCtls.Where(Function(c) TypeOf c Is ContainerControl AndAlso TypeOf c Is Form OrElse TypeOf c Is UserControl)
    8. For Each fld In ctl.GetType.GetFields(bindFlags).Where(Function(f) f.FieldType = GetType(BindingSource))
    9. Dim bs2 = DirectCast(fld.GetValue(ctl), BindingSource)
    10. If bs2 Is Nothing Then Continue For
    11. If tb Is bs2.DataTable Then
    12. bs2.DataSource = item
    13. If frm.ShowDialog() = Windows.Forms.DialogResult.OK Then
    14. bs2.EndEdit()
    15. bs.ResetCurrentItem() 'den von der anneren BS geänderten Datensatz neu einlesen.
    16. Else
    17. bs.CancelEdit()
    18. End If
    19. Return
    20. End If
    21. Next
    22. Next
    23. Throw New Exception("es konnte keine geeignete BindingSource gefunden werden.".And2( _
    24. "\nHinweis:", _
    25. "\nDie Extension-Method '<BindingSource>.", (New StackTrace).GetFrame(1).GetMethod.Name, "()' funktioniert nur, wenn zuvor", _
    26. "\n<", tb.DataSet.GetType.Name, ">.Register(<", GetType(T).Name, ">)", _
    27. "\naufgerufen wurde."))
    28. End Using
    29. End Sub

    Die Exception besagt:
    "Die Sortierzeichenfolge enthält eine Eigenschaft, die nicht in der IBindingList steht."
    Die betroffene Bindingsource ist nicht sortiert.

    Frage an @ErfinderDesRades : Was ist falsch oder könnte falsch sein?

    //EDIT:
    Bin einen Schritt weiter.
    Die Bindingsources der Child-Views im Edit-Form enthalten SORT-Anweisungen. Wenn ich diese entferne, funktioniert der Code.
    Nun wollte ich schlau sein, und in der Form_Shown-Routine wieder Bindingsource.Sort="Feldname ASC" komplettieren. Aber dann kommt genau an dieser Stelle der Zuweisung die Exception:
    "Die Sortierzeichenfolge enthält eine Eigenschaft, die nicht in der IBindingList steht.".
    Wahrscheinlich, weil die Child-Tables den Parent-Datensatz noch nicht kennen? Stochern im Nebel ...

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

    Habich jetzt nachgeguckt - die EditNew-Extension ist nicht drauf ausgelegt, Datensätze + Child-Datensätze neu anzulegen.
    also angenommen Kategorie und Artikel, und mit Editnew willst du eine neue Kategorie anlegen: Dann ist der ja noch ühaupt kein Artikel untergeordnet.
    Du hast da jetzt einen dialog angelegt, der aber die Artikel auch anzeigt, und dieses DGV ist logischeweise in jedem Falle leer - denn zu einer neu erzeugten Kategorie kanns noch keine Artikel geben.
    Also mach für EditNew einen annern Dialog, der keine untergeordneten Tabellen anzeigt, die sowieso leer sind.
    Ja, hatt' ich ja auch schon festgestellt.
    Interessanterweise erlauben aber im Edit-Formular die an Child-Tables gebundenen Datagridviews erfolgreich Dateneingabe und Persistierung.
    Mal schon, ob durch einen "Hackaround" die Sortierung wieder in Kraft gesetzt werden kann.

    us4711 schrieb:

    Interessanterweise erlauben aber im Edit-Formular die an Child-Tables gebundenen Datagridviews erfolgreich Dateneingabe und Persistierung.
    Ja, und dassis auch logisch.
    Beim EditCurrent() obiger beispiel-Kategorie ist die Kategorie ja bereits vorhanden.
    Dann kannst du auch Artikel zufügen.

    Bei EditNew() hingegen gibts die neue Kategorie noch nicht (es gibt sie, sie ist aber noch nicht der Category-Tabelle zugefügt). Die wird erst zugefügt, wenn du den Dialog mit Ok schließst (du könntest ja auch canceln).
    Folglich, wenn du innerhalb des Dialoges dieser noch nicht existenten Kategorie einen Artikel zufügen willst, springt dir das Dataset ins Gesicht.
    Interessanterweise erlauben aber im Edit-Formular die an Child-Tables gebundenen Datagridviews erfolgreich Dateneingabe und Persistierung.

    Ja, aber des geht auch bei EditNew !!!
    Die Child-Tables haben weitere Child-Tables (insgesamt 3 Ebenen), und auch dort funktioklappt bei Editnew() die Dateneingabe und Peristierung :?: :?: :?:
    Diesen Child.Child.Tabellen vertragen in ihren zugeordneten Bindingsources keine Angabe von Bindingsource.Sort, dann gehts.
    Allerdings, der Versuch in den zugeordneten Child.Child-Datagridviews per Click auf den Spaltenkopf zu sortieren, wird mit einem Laufzeitfehler bestraft:
    "Das datengebundene DataGridView-Steuerelement kann nur nach datengebundenen Spalten sortiert werden."
    Hast Du ja weiter oben darauf hingewiesen.
    Aber schon pberrascht es mich, das "dort funktioklappt bei Editnew() die Dateneingabe und Peristierung", sihe oben.
    komisch. Ich kriege bei solch Versuchen folgenden Fehler als Messagebox:
    ---------------------------
    Standard-Fehlerdialogfeld für DataGridView
    ---------------------------
    DataGridView-Ausnahme:



    System.Data.InvalidConstraintException: Für ForeignKeyConstraint KategorienArtikel müssen die untergeordneten Schlüsselwerte (-10) in der übergeordneten Tabelle vorhanden sein.

    bei System.Data.ForeignKeyConstraint.CheckConstraint(DataRow childRow, DataRowAction action)
    ...


    Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.
    ---------------------------
    OK
    ---------------------------
    Hast du bei deinen Versuchen auch wirklcih mehrere untergeordnete Datensätze zugefügt?

    Oder du hast eine lockere DataRelation konfiguriert, ohne ForeignKey-Constraint, sodass keine strenge Überprüfung der Datenkonsistenz durchgeführt wird.
    Tät ich nicht empfehlen

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

    ??????????????? Eigentlich war ich der Meinung, das die Relations mit mit "Sowohl Beziehungs- als auch Fremdschlüsseleinschränkung", mit den Parametern Cascade/Cascade/None definiert sind.
    Die dahinterliegende Datenbasis ist eine MS-Access Datenbank, in der die Relations unter DATENBANKTOOLS/BEZIEHUNGEN definiert sind. Bei Erstellung der Datenquelle werden die prima übernommen. Und in Acces sind die Relations "mit referentieller Integrität", "Aktualisierungsweitergabe an verwandte Felder" und mit "Löschweitergabe an verwandte Datensätze" definiert.

    ABER:
    Mit Nichten Und Tanten sind die Einstellungen der Relations vom Datendesigner übernommen worden, sondern die generierte Einstellung lautet: "Nur Beziehung" - danke für den Hinweis, @ErfinderDesRades

    Ist das nun Bug oder Feature oder muss ich in Access oder im Datendesigner noch irgendwo ein Häkchen setzen?

    Tja, so sammelt man wohl Erfahrung ...

    Werde die Relations des Datasets natürlich umbauen, und dann schaun 'mer 'mal.

    \\EDIT:
    Hab' am Anfang des Projektes (die Mitgliederverwaltung eines Vereins) überlegt, Deiner ständigen Empfehlung "mach's mit Dataset only" zu folgen. Aber - die mdb wird auf einem I-Server vorgehalten, und enthält Live Daten, die von den über die BRD verteilten, berechtigten Funktionsträgern auch zum generieren eigener Reports verwendet wird. Daher ist ein Umstieg auf DatasetOnly m.E. nicht möglich. Die Pflege der Daten liegt jedoch an zentraler Stelle.

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

    @VB1963
    "omittedby design" ist die Antwort .. et jeht nich ...
    Accessing External Data with MS Access. Der Umkehrschluss zeigt, das die gewünschte Verhaltensweise nicht vorgesehen ist.
    Nun denn, Handarbeit ist angesagt ... nur nicht vergessen bis zum nächsten Mal ;(